home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / kowin / archive / kob / kob001s.lzh / xb2.has < prev    next >
Text File  |  1997-03-08  |  46KB  |  3,309 lines

  1.  
  2. *━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  3. *
  4. *    xb2.has  ……   ぺけ-BASICのインタプリタ本体
  5. *
  6. *━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  7.  
  8.     .xref    ko_debug
  9.     .xref    ko_dec_print
  10.     .xref    ko_hex_print
  11.  
  12.  
  13.     .include    kob.h
  14.     .include    doscall.mac
  15.     .include    iocscall.mac
  16.     .include    fefunc.h
  17.  
  18.     .include    variable.h
  19.  
  20. *    .xref    error
  21. *    .xref    errors
  22.     .xref    error_sub
  23.     .xref    errors_sub
  24.     .xref    dec_print
  25. *    .xref    init_tpal
  26.     .xref    endendend
  27.  
  28.     .xref    I行数算出
  29.  
  30.     .xref    a6保存
  31.  
  32.  
  33.  
  34. IERROR    .macro    num
  35.     bsr    I行数算出
  36.     moveq    #num,d0
  37.     bsr    error_sub
  38.     bra    _kob_exec_err
  39.     .endm
  40.  
  41. IERRORS    .macro    num
  42.     bsr    I行数算出
  43.     moveq    #num,d0
  44.     bsr    errors_sub
  45.     bra    _kob_exec_err
  46.     .endm
  47.  
  48.  
  49.  
  50.     .offset    0
  51. Aint:        .ds.l    1
  52. Astr:        .ds.l    1
  53. Afloat:        .ds.l    1
  54. Achar:        .ds.l    1
  55. Asysvar:    .ds.l    1
  56. orgstrbuf:    .ds.l    1
  57. orgSP:        .ds.l    1
  58. *DIEI:        .ds.b    1
  59. *        .ds.b    3
  60. Adim:
  61.  
  62.  
  63.  
  64.  
  65.     .text
  66.     .even
  67.  
  68.  
  69.  
  70.     .xdef    _kobas_init_exec
  71. _kobas_init_exec:
  72.     movem.l    d3-d7/a3-a6,-(sp)
  73.     move.l    a6保存(pc),a6
  74. *    clr.w    xb動作mode
  75. *    move.l    xbFLAG,d7
  76. *    move.l    変数area,-(sp)        * 最初だけは global 変数に領域を預けるのだよ(そんなことわかりきってるだろうに馬鹿だねえ)
  77.  
  78.         move.l    b_argv,-(sp)
  79.         subq.l    #4,sp
  80.         move.w    #$0003,-(sp)    * str (関係ないけど一応)
  81.         move.l    b_argc,-(sp)
  82.         subq.l    #4,sp
  83.         move.w    #$0001,-(sp)    * int (関係ないけど一応)
  84.         move.w    #2,-(sp)    * 2個
  85.     move.l    中間言語,-(sp)
  86.     clr.l    -(sp)            * auto システム変数
  87.  
  88.     bsr    _kob_exec
  89.     lea.l    4+4+2+10+10(sp),sp
  90.         .xref    _kob_flag
  91.         clr.w    _kob_flag
  92.  
  93.     movem.l    (sp)+,d3-d7/a3-a6
  94.     moveq    #0,d0
  95.     rts
  96.  
  97.  
  98.     .xdef    _kob_exec
  99. _kob_exec:
  100.     *    KH    '変数area = ',変数area
  101.  
  102.     lea.l    12(sp),a3        * 引き数列先頭(引き数の個数込み)
  103.  
  104.     movem.l    4(sp),a4/a5        * auto sysvar/program point
  105.  
  106.     movea.l    4+変数INIT,a0
  107.     adda.w    (a5)+,a0    * 変数確保リストの先頭アドレス
  108.     move.w    4+8(a0),d0    * 配列の個数 - 1
  109.     lsl.w    #2,d0
  110.     add.w    #Adim+4,d0    * Adim + 配列の個数 * 4
  111.  
  112.     movea.l    a4,a1        * auto システム変数
  113.     movea.l    変数area,a4    * 変数ハンドラ
  114.     move.l    sp,orgSP(a4)
  115.     move.l    a1,Asysvar(a4)
  116.     lea.l    (a4,d0.w),a1    * (auto)変数のハンドルを収める領域を確保
  117.  
  118.     move.l    a3,-(sp)    * 引き数列先頭 保存&パラメーター渡し
  119.     tst.b    d7
  120.     bmi    auto_vc
  121.  
  122.         lea.l    Adim(a4),a2
  123.         move.l    a2,配列
  124.         move.l    a2,-(sp)
  125.     pea.l    変数float
  126.     pea.l    変数char
  127.     pea.l    変数str
  128.     pea.l    変数int
  129.     bra    @f
  130. auto_vc:
  131.     pea.l    Adim(a4)
  132.     pea.l    Afloat(a4)
  133.     pea.l    Achar(a4)
  134.     pea.l    Astr(a4)
  135.     pea.l    Aint(a4)
  136. @@:
  137.     bsr    Variable_clr_sub    * 変数領域確保 & 引き数セット
  138.     lea.l    4*6(sp),sp
  139. *    clr.b    DIEI(a4)        * EI
  140.  
  141.  
  142.     move.l    strbuf,orgstrbuf(a4)
  143. main_loop:
  144. main_cont:
  145.     move.l    orgstrbuf(a4),strbuf
  146.  
  147.     moveq    #0,d4            * いらない
  148.     move.w    (a5)+,d4
  149.     *    KH    'statement 番号',d4
  150.     *    tst.w    d4
  151.     bmi    式
  152.     beq    関数呼び出し
  153. statement:
  154.     move.w    stt(pc,d4.w),d4
  155.     jmp    stt(pc,d4.w)
  156. stt:
  157.     .dc.w    関数呼び出し-stt    *
  158.     .dc.w    Color-stt
  159.     .dc.w    Console-stt
  160.     .dc.w    Locate-stt
  161.     .dc.w    Lprint-stt
  162.     .dc.w    Print-stt
  163.     .dc.w    Width-stt
  164.     .dc.w    Screen-stt
  165.     .dc.w    Break-stt
  166.     .dc.w    Case-stt    *
  167.     .dc.w    Continue-stt        *10
  168.     .dc.w    Default-stt    *
  169.     .dc.w    Endfunc-stt
  170.     .dc.w    Switch2-stt
  171.     .dc.w    Error-stt
  172.     .dc.w    Return-stt
  173.     .dc.w    Switch-stt
  174.     .dc.w    Beep-stt
  175.     .dc.w    Cls-stt
  176.     .dc.w    End-stt
  177.     .dc.w    Endwhile-stt        *20
  178.     .dc.w    Exit-stt
  179.     .dc.w    For-stt
  180.     .dc.w    Gosub-stt    *
  181.     .dc.w    Goto-stt
  182.     .dc.w    If-stt
  183.     .dc.w    Input-stt
  184.     .dc.w    Key-stt
  185.     .dc.w    Linput-stt
  186.     .dc.w    Next-stt
  187.     .dc.w    Next2-stt        *30
  188.     .dc.w    Stop-stt
  189.     .dc.w    Until-stt
  190.     .dc.w    While-stt
  191.     .dc.w    Dim-stt
  192.     .dc.w    ColorP-stt    * 35
  193.     .dc.w    FuncKey-stt    * 36
  194.     .dc.w    CursorSW-stt    * 37
  195.     .dc.w    Str-stt        * 38
  196.     .dc.w    Func-stt
  197.     .dc.w    Else-stt        *40
  198.     .dc.w    SysVar-stt        *41
  199.     .dc.w    Ifeq-stt        *42
  200.     .dc.w    Ifne-stt
  201.     .dc.w    Iflt-stt
  202.     .dc.w    Ifgt-stt
  203.     .dc.w    Ifle-stt
  204.     .dc.w    Ifge-stt        *47
  205.     .dc.w    ItSet-stt        *48
  206.  
  207.  
  208. 関数呼び出し:
  209.     bsr    function_call
  210.  
  211. *main_cont:
  212. *    move.b    DIEI(a4),d0
  213. *    bne    main_loop
  214.     bra    main_loop
  215.  
  216. _kob_driven_end:
  217.     move.l    d7,xbFLAG
  218.     move.l    orgSP(a4),sp
  219. *    movem.l    (sp)+,d3-d7/a3-a6
  220.     moveq    #0,d0
  221.     rts
  222.  
  223.  
  224. _kob_driven_err::
  225. _kob_exec_err::
  226.     move.l    d7,xbFLAG
  227.     move.l    orgSP(a4),sp
  228. *    movem.l    (sp)+,d3-d7/a3-a6
  229.     .xref    _kobas_exit
  230.     bsr    _kobas_exit
  231.     moveq    #-1,d0            * 多分ここには戻ってこないけど一応形だけ
  232.     rts
  233.  
  234.  
  235.  
  236. **    **    **    **    **    **    **    **    **
  237.  
  238.  * 代入式だった
  239. 式:
  240.     btst    #14,d4
  241.     beq    普通変数への代入
  242.  
  243.  
  244.  
  245. 配列への代入:
  246.  * d4.b = 代入先の型
  247.     bsr    値get        * 値を得る
  248.     move.l    d0,d2
  249.     move.l    d1,d3
  250.     movea.l    a0,a1
  251.     bsr    dim_set_sub        * d2-d5/a1 保存
  252.  
  253.     tst.b    d4
  254.     beq    int_setD
  255.     bmi    float_setD
  256.     subq.b    #1,d4
  257.     beq    str_setD
  258. *char_setD:
  259.     move.b    d2,(a0,d0.l)
  260.     bra    main_cont
  261.  
  262. str_setD:
  263.     lsl.l    #8,d0
  264.     lea.l    (a0,d0.l),a0
  265. @@:
  266.     move.b    (a1)+,(a0)+
  267.     bne    @b
  268.     bra    main_cont
  269.  
  270. float_setD:
  271. .ifdef    _XB030
  272.     movem.l    d2-d3,(a0,d0.l*8)
  273. .else
  274.     lsl.l    #3,d0
  275.     movem.l    d2-d3,(a0,d0.l)
  276. .endif
  277.     bra    main_cont
  278.  
  279. int_setD:
  280. .ifdef    _XB030
  281.     move.l    d2,(a0,d0.l*4)
  282. .else
  283.     lsl.l    #2,d0
  284.     move.l    d2,(a0,d0.l)
  285. .endif
  286.     bra    main_cont
  287.  
  288.  
  289.  
  290.  
  291.  
  292. 普通変数への代入:
  293.  * d4.b = 代入先の型
  294.     bsr    値get        * 値を得る
  295.     move.w    (a5)+,d2    * 代入先の変数番号
  296.     bmi    auto変数set
  297.  
  298.     tst.b    d4
  299.     beq    int_set
  300.     bmi    float_set
  301.     subq.b    #1,d4
  302.     beq    str_set
  303. *char_set:
  304.     movea.l    変数char,a1        * とりあえず兼用
  305.     move.b    d0,(a1,d2.w)
  306.     bra    main_cont
  307.  
  308. float_set:
  309.     movea.l    変数float,a1        * とりあえず兼用
  310. .ifdef    _XB030
  311.     movem.l    d0-d1,(a1,d2.w*8)
  312. .else
  313.     lsl.w    #3,d2
  314.     movem.l    d0-d1,(a1,d2.w)
  315. .endif
  316.     bra    main_cont
  317.  
  318. str_set:
  319.     movea.l    変数str,a1        * とりあえず兼用
  320.     lsl.w    #8,d2
  321.     lea.l    (a1,d2.w),a1
  322. @@:
  323.     move.b    (a0)+,(a1)+
  324.     bne    @b
  325.     bra    main_cont
  326.  
  327. int_set:
  328.     movea.l    変数int,a1        * とりあえず兼用
  329. .ifdef    _XB030
  330.     move.l    d0,(a1,d2.w*4)
  331. .else
  332.     lsl.w    #2,d2
  333.     move.l    d0,(a1,d2.w)
  334. .endif
  335.     bra    main_cont
  336.  
  337.  
  338.  
  339. auto変数set:
  340.     not.w    d2
  341.  
  342.     tst.b    d4
  343.     beq    int_setA
  344.     bmi    float_setA
  345.     subq.b    #1,d4
  346.     beq    str_setA
  347. *char_set:
  348.     movea.l    Achar(a4),a1
  349.     move.b    d0,(a1,d2.w)
  350.     bra    main_cont
  351.  
  352. float_setA:
  353.     movea.l    Afloat(a4),a1
  354. .ifdef    _XB030
  355.     movem.l    d0-d1,(a1,d2.w*8)
  356. .else
  357.     lsl.w    #3,d2
  358.     movem.l    d0-d1,(a1,d2.w)
  359. .endif
  360.     bra    main_cont
  361.  
  362. str_setA:
  363.     movea.l    Astr(a4),a1
  364.     lsl.w    #8,d2
  365.     lea.l    (a1,d2.w),a1
  366. @@:
  367.     move.b    (a0)+,(a1)+
  368.     bne    @b
  369.     bra    main_cont
  370.  
  371. int_setA:
  372.     movea.l    Aint(a4),a1
  373. .ifdef    _XB030
  374.     move.l    d0,(a1,d2.w*4)
  375. .else
  376.     lsl.w    #2,d2
  377.     move.l    d0,(a1,d2.w)
  378. .endif
  379.     bra    main_cont
  380.  
  381.  
  382.  
  383.  
  384.  
  385.  
  386.  
  387.  
  388.  
  389. stack_over:
  390.     IERROR    8
  391.  
  392.  
  393. **    **    **    main_cont 部分終わり    **    **    **    **
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400.  
  401.  
  402.  
  403.  
  404.  
  405.  
  406.  
  407.  
  408.  
  409.  
  410.  
  411.  
  412.  
  413.  
  414.  
  415.  
  416.  
  417.  
  418.  
  419.  
  420.  
  421. **    **    **    **    **    **    **    **    **
  422. float値get:
  423.     moveq    #-1,d4
  424.     bra    値get
  425. str値get:
  426.     moveq    #1,d4
  427.  
  428.  * (d4.b) 型の数式を評価して、( (d1/)d2-d4/a1 保存 )
  429.  * int の時、    d0    に値を返す
  430.  * float    d0-d1
  431.  * str        a0
  432. 値get:                    * どこかで d4.l を破壊している
  433.     move.w    (a5)+,d0
  434.     tst.b    d0
  435.     beq    ig111
  436.     bmi    fg111
  437.     cmpi.b    #2,d0
  438.     beq    cg111
  439. *sg111:
  440.     cmpi.b    #1,d4
  441.     bne    型違い
  442.     move.w    d4,-(sp)
  443.     move.l    d1,-(sp)
  444.     bsr    str_get0
  445.     move.l    (sp)+,d1
  446.     move.w    (sp)+,d4
  447.     rts
  448.  
  449. cg111:
  450.     tst.w    d0
  451.     bmi    1f
  452.     btst    #14,d0
  453.     bne    char_val
  454.     bsr    int_cal        * int でいい
  455.     bra    @f        **
  456. 1:
  457.     bclr    #14,d0
  458.     beq    char_imm
  459. *char_fnc:
  460.     movem.l    d1-d4/a1,-(sp)
  461.     bsr    function_call
  462.     movem.l    (sp)+,d1-d4/a1
  463.     tst.w    (a0)
  464.     bne    返り値がない
  465.     move.l    2+4(a0),d0
  466.     bra    4f
  467.  
  468. char_val:
  469.     btst    #13,d0
  470.     bne    char_dim
  471.  
  472.     btst    #12,d0
  473.     bne    str_point
  474.  
  475.     btst    #8,d0
  476.     beq    1f
  477.     movea.l    Achar(a4),a0
  478.     bra    2f
  479. 1:
  480.     movea.l    変数char,a0        * とりあえず兼用
  481. 2:
  482.     move.w    (a5)+,d0
  483.     move.b    (a0,d0.w),d0
  484.     bra    4f
  485.  
  486.  
  487.  
  488. char_dim:
  489.     move.l    d1,-(sp)
  490.     bsr    dim_sub
  491.     move.l    (sp)+,d1
  492.     move.b    (a0,d0.l),d0
  493.     bra    4f
  494.  
  495.  
  496. str_point:
  497.     btst    #8,d0
  498.     bne    1f
  499.  
  500.     bsr    int値get
  501.     movea.l    変数str,a0        * とりあえず兼用
  502.     bra    2f
  503. 1:
  504.     bsr    int値get
  505.     movea.l    Astr(a4),a0
  506. 2:
  507.     cmpi.w    #$100,d0
  508.     bcc    str_access_err
  509.     move.l    d1,-(sp)
  510.     move.w    (a5)+,d1
  511.     lsl.w    #8,d1
  512.     add.w    d0,d1
  513.     move.b    (a0,d1.w),d0
  514.  
  515.     move.l    (sp)+,d1
  516.     bra    4f
  517.  
  518.  
  519. char_imm:
  520.     move.l    (a5)+,d0
  521. *    bra    4f
  522.  
  523. 4:
  524.     andi.l    #$000000ff,d0    * char
  525.     bra    @f
  526.  
  527.  
  528.  
  529.  
  530. ig111:
  531.     tst.w    d0
  532.     bmi    1f
  533.     bclr    #14,d0
  534.     bne    int_val
  535.     bsr    int_cal
  536.     bra    @f
  537.  
  538. int_val:
  539.     btst    #13,d0
  540.     bne    int_dim
  541.  
  542.     btst    #8,d0
  543.     bne    auto_int_val
  544.     move.w    (a5)+,d0
  545.     bge    normal_int_var
  546.     bsr    int_system_var
  547.     bra    @f
  548. 1:
  549.     bclr    #14,d0
  550.     beq    int_imm
  551. int_fnc:
  552.     movem.l    d1-d4/a1,-(sp)
  553.     bsr    function_call
  554.     movem.l    (sp)+,d1-d4/a1
  555.     tst.w    (a0)
  556.     bne    返り値がない
  557.     move.l    2+4(a0),d0
  558.     bra    @f
  559.  
  560.  
  561. normal_int_var:
  562.     movea.l    変数int,a0        * とりあえず兼用
  563. .ifdef    _XB030
  564.     move.l    (a0,d0.w*4),d0
  565. .else
  566.     lsl.w    #2,d0
  567.     move.l    (a0,d0.w),d0
  568. .endif
  569.     bra    @f
  570. auto_int_val:
  571.     move.w    (a5)+,d0
  572.     movea.l    Aint(a4),a0
  573. .ifdef    _XB030
  574.     move.l    (a0,d0.w*4),d0
  575. .else
  576.     lsl.w    #2,d0
  577.     move.l    (a0,d0.w),d0
  578. .endif
  579.     bra    @f
  580.  
  581.  
  582. int_dim:
  583.     move.l    d1,-(sp)
  584.     bsr    dim_sub
  585.     move.l    (sp)+,d1
  586. .ifdef    _XB030
  587.     move.l    (a0,d0.l*4),d0
  588. .else
  589.     lsl.l    #2,d0
  590.     move.l    (a0,d0.l),d0
  591. .endif
  592.     bra    @f
  593.  
  594. int_imm:
  595.     move.l    (a5)+,d0
  596. *    bra    @f
  597.  
  598.  
  599.  
  600. @@:
  601.     tst.b    d4
  602.     beq    ig111_ok
  603.     bmi    float_trans
  604.     cmpi.b    #1,d4
  605.     beq    型違い        * str
  606. *    andi.l    #$000000ff,d0    * char
  607. ig111_ok:
  608.     rts            * int,char 同士
  609. float_trans:
  610.     FPACK    __LTOD        * float <- int,char
  611.     rts
  612.  
  613.  
  614.  
  615. fg111:
  616.     move.l    d1,-(sp)    *
  617.     move.w    d4,-(sp)
  618.     bsr    float_get0
  619.     move.w    (sp)+,d4
  620.     tst.b    d4
  621.     beq    int_trans
  622.     bmi    fl_ok
  623.     cmpi.b    #1,d4
  624.     beq    型違い
  625.     FPACK    __DTOL        * char <- float
  626.     andi.l    #$ff,d0
  627.     move.l    (sp)+,d1
  628.     rts
  629. int_trans:
  630.     FPACK    __DTOL        * int <- float
  631.     move.l    (sp)+,d1
  632.     rts
  633. fl_ok:
  634.     addq.l    #4,sp        * float 同士
  635.     rts
  636.  
  637.  
  638.  
  639.  
  640.  
  641.  
  642.  
  643. int値get:                * d4.l 保存!!
  644.     move.w    (a5)+,d0
  645.     tst.b    d0
  646.     beq    ig112
  647.     bmi    fg112
  648.     cmpi.b    #2,d0
  649.     bne    型違い
  650. *cg112:
  651.     tst.w    d0
  652.     bmi    1f
  653.     btst    #14,d0
  654.     bne    char_val2
  655.     bsr    int_cal        * int でいい
  656.     rts
  657. *    bra    4f
  658. 1:
  659.     bclr    #14,d0
  660.     beq    char_imm2
  661. *char_fnc2:
  662.     movem.l    d1-d4/a1,-(sp)
  663.     bsr    function_call
  664.     movem.l    (sp)+,d1-d4/a1
  665.     tst.w    (a0)
  666.     bne    返り値がない
  667.     move.l    2+4(a0),d0
  668.     bra    4f
  669.  
  670. char_val2:
  671.     btst    #13,d0
  672.     bne    char_dim2
  673.  
  674.     btst    #12,d0
  675.     bne    str_point2
  676.  
  677.     btst    #8,d0
  678.     beq    1f
  679.     movea.l    Achar(a4),a0
  680.     bra    2f
  681. 1:
  682.     movea.l    変数char,a0        * とりあえず兼用
  683. 2:
  684.     move.w    (a5)+,d0
  685.     move.b    (a0,d0.w),d0
  686.     bra    4f
  687.  
  688.  
  689.  
  690. char_dim2:
  691.     move.l    d1,-(sp)
  692.     bsr    dim_sub
  693.     move.l    (sp)+,d1
  694.     move.b    (a0,d0.l),d0
  695.     bra    4f
  696.  
  697.  
  698. str_point2:
  699.     btst    #8,d0
  700.     bne    1f
  701.  
  702.     bsr    int値get
  703.     movea.l    変数str,a0        * とりあえず兼用
  704.     bra    2f
  705. 1:
  706.     bsr    int値get
  707.     movea.l    Astr(a4),a0
  708. 2:
  709.     move.l    d1,-(sp)
  710.     cmpi.w    #$100,d0
  711.     bcc    str_access_err
  712.     move.w    (a5)+,d1
  713.     lsl.w    #8,d1
  714.     add.w    d0,d1
  715.     move.b    (a0,d1.w),d0
  716.  
  717.     move.l    (sp)+,d1
  718.     bra    4f
  719.  
  720.  
  721. char_imm2:
  722.     move.l    (a5)+,d0
  723. *    bra    4f
  724.  
  725. 4:
  726.     andi.l    #$000000ff,d0    * char
  727.     rts
  728.  
  729.  
  730.  
  731.  
  732. ig112:
  733.     tst.w    d0
  734.     bmi    1f
  735.     bclr    #14,d0
  736.     bne    int_val2
  737.     bsr    int_cal
  738.     rts
  739.  
  740. int_val2:
  741.     btst    #13,d0
  742.     bne    int_dim2
  743.  
  744.     btst    #8,d0
  745.     bne    auto_int_val2
  746.     move.w    (a5)+,d0
  747.     bge    normal_int_var2
  748.     bra    int_system_var
  749.     *bsr    int_system_var
  750.     *rts
  751. 1:
  752.     bclr    #14,d0
  753.     beq    int_imm2
  754. int_fnc2:
  755.     movem.l    d1-d4/a1,-(sp)
  756.     bsr    function_call
  757.     movem.l    (sp)+,d1-d4/a1
  758.     tst.w    (a0)
  759.     bne    返り値がない
  760.     move.l    2+4(a0),d0
  761.     rts
  762.  
  763.  
  764. normal_int_var2:
  765.     movea.l    変数int,a0        * とりあえず兼用
  766. .ifdef    _XB030
  767.     move.l    (a0,d0.w*4),d0
  768. .else
  769.     lsl.w    #2,d0
  770.     move.l    (a0,d0.w),d0
  771. .endif
  772.     rts
  773. auto_int_val2:
  774.     move.w    (a5)+,d0
  775.     movea.l    Aint(a4),a0
  776. .ifdef    _XB030
  777.     move.l    (a0,d0.w*4),d0
  778. .else
  779.     lsl.w    #2,d0
  780.     move.l    (a0,d0.w),d0
  781. .endif
  782.     rts
  783.  
  784.  
  785. int_dim2:
  786.     move.l    d1,-(sp)
  787.     bsr    dim_sub
  788.     move.l    (sp)+,d1
  789. .ifdef    _XB030
  790.     move.l    (a0,d0.l*4),d0
  791. .else
  792.     lsl.l    #2,d0
  793.     move.l    (a0,d0.l),d0
  794. .endif
  795.     rts
  796.  
  797. int_imm2:
  798.     move.l    (a5)+,d0
  799.     rts
  800.  
  801.  
  802.  
  803. fg112:
  804.     move.l    d1,-(sp)    *
  805.     move.w    d4,-(sp)
  806.     bsr    float_get0
  807.     move.w    (sp)+,d4
  808.     FPACK    __DTOL        * int <- float
  809.     move.l    (sp)+,d1
  810.     rts
  811.  
  812.  
  813.  
  814.  
  815.  
  816.  
  817.  
  818. 型違い:
  819.     IERROR    31
  820. 返り値がない:
  821.     IERROR    49
  822.  
  823.  
  824.  
  825.  
  826.  
  827.  
  828.  
  829.  
  830.  
  831.  
  832.  
  833. *    *    *    *    *    *    *    *
  834.  
  835. float_get0:
  836.     tst.w    d0
  837.     bmi    fg1
  838.     btst    #14,d0
  839.     beq    float_cal
  840.  
  841.  * float_val
  842.     btst    #13,d0
  843.     bne    float_dim
  844.  
  845.     btst    #8,d0
  846.     beq    1f
  847.     movea.l    Afloat(a4),a0
  848.     bra    2f
  849. 1:
  850.     movea.l    変数float,a0        * とりあえず兼用
  851. 2:
  852.     move.w    (a5)+,d0
  853.     lsl.w    #3,d0
  854.     movem.l    (a0,d0.w),d0-d1
  855.     rts
  856.  
  857.  
  858.  
  859. float_dim:
  860.     bsr    dim_sub
  861.     lsl.l    #3,d0
  862.     movem.l    (a0,d0.l),d0-d1
  863.     rts
  864.  
  865.  
  866.  
  867. fg1:
  868.     bclr    #14,d0
  869.     beq    float_imm
  870.  * float_fnc
  871.     movem.l    d2-d4/a1,-(sp)
  872.     bsr    function_call
  873.     movem.l    (sp)+,d2-d4/a1
  874.     tst.w    (a0)
  875.     bne    返り値がない
  876.     movem.l    2(a0),d0-d1
  877.     rts
  878.  
  879.  
  880. float_imm:
  881.     movem.l    (a5)+,d0/d1
  882.     rts
  883.  
  884.  
  885. float_cal:
  886.     movem.l    d2-d3,-(sp)
  887.  
  888.     move.w    (a5)+,d0
  889. *    add.w    d0,d0
  890.     move.w    fc(pc,d0.w),d0
  891.     jmp    fc(pc,d0.w)
  892. fc:
  893.     .dc.w    0    * dummy
  894.     .dc.w    Fmul-fc
  895.     .dc.w    Fdiv-fc
  896.     .dc.w    Fdiv2-fc
  897.     .dc.w    Fmod-fc
  898.     .dc.w    Fadd-fc
  899.     .dc.w    Fsub-fc
  900.     .dc.w    Fshr-fc
  901.     .dc.w    Fshl-fc
  902.     .dc.w    Fequal-fc
  903.     .dc.w    Fnoteq-fc
  904.     .dc.w    Fsmall-fc
  905.     .dc.w    Flarge-fc
  906.     .dc.w    Feq_small-fc
  907.     .dc.w    Feq_large-fc
  908.     .dc.w    Fnot-fc
  909.     .dc.w    Fand-fc
  910.     .dc.w    FFor-fc
  911.     .dc.w    Fxor-fc
  912.     .dc.w    Fminus-fc
  913.  
  914. Fmul:
  915.     bsr    float値get
  916.     move.l    d0,d2
  917.     move.l    d1,d3
  918.     bsr    float値get
  919.     FPACK    __DMUL        * 手抜き
  920.     bra    float_cal_end
  921. Fdiv:
  922.     bsr    float値get
  923.     move.l    d0,d2
  924.     move.l    d1,d3
  925.     bsr    float値get
  926.     exg.l    d0,d2
  927.     exg.l    d1,d3
  928.     FPACK    __DDIV        * 手抜き
  929.     bra    float_cal_end
  930. Fdiv2:
  931.     bsr    float値get
  932.     FPACK    __DTOL
  933.     move.l    d0,d2
  934.     bsr    float値get
  935.     FPACK    __DTOL
  936.     move.l    d0,d1
  937.     move.l    d2,d0
  938.     FPACK    __LDIV        * 手抜き
  939.     FPACK    __LTOD
  940.     bra    float_cal_end
  941. Fmod:
  942.     bsr    float値get
  943.     FPACK    __DTOL
  944.     move.l    d0,d2
  945.     bsr    float値get
  946.     FPACK    __DTOL
  947.     move.l    d0,d1
  948.     move.l    d2,d0
  949.     FPACK    __LMOD        * 手抜き
  950.     FPACK    __LTOD
  951.     bra    float_cal_end
  952.  
  953. Fadd:
  954.     bsr    float値get
  955.     move.l    d0,d2
  956.     move.l    d1,d3
  957.     bsr    float値get
  958.     FPACK    __DADD        * 手抜き
  959.     bra    float_cal_end
  960. Fsub:
  961.     bsr    float値get
  962.     move.l    d0,d2
  963.     move.l    d1,d3
  964.     bsr    float値get
  965.     exg.l    d0,d2
  966.     exg.l    d1,d3
  967.     FPACK    __DSUB        * 手抜き
  968.     bra    float_cal_end
  969.  
  970. Fminus:
  971.     bsr    float値get
  972.     bchg    #31,d0        * 符号反転
  973.     bra    float_cal_end
  974.  
  975. Fequal:
  976. Fnoteq:
  977. Fsmall:
  978. Flarge:
  979. Feq_small:
  980. Feq_large:
  981. Fshr:
  982. Fshl:
  983. Fnot:
  984. Fand:
  985. FFor:
  986. Fxor:
  987.     .xdef    floatにない演算
  988. floatにない演算:
  989.     IERROR    2
  990.  
  991.  
  992. float_cal_end:
  993.     movem.l    (sp)+,d2-d3
  994.     rts
  995.  
  996.  
  997.  
  998.  
  999.  
  1000.  
  1001. **    **    **    **    **    **
  1002.  
  1003. str_get0:
  1004.     tst.w    d0
  1005.     bmi    sg1
  1006.     btst    #14,d0
  1007.     beq    str_cal
  1008.  
  1009.  * str_val
  1010.     btst    #13,d0
  1011.     bne    str_dim
  1012.  
  1013.     btst    #8,d0
  1014.     bne    auto_str_var
  1015.  
  1016.     move.w    (a5)+,d0
  1017.     bge    normal_str_var
  1018.  * str_system_var
  1019.     add.w    d0,d0
  1020.     move.w    str_sys(pc,d0.w),d0
  1021.     jmp    str_sys(pc,d0.w)
  1022.  
  1023.     .dc.w    Inkey0-str_sys
  1024.     .dc.w    Inkey-str_sys
  1025.     .dc.w    Time-str_sys
  1026.     .dc.w    Day-str_sys
  1027.     .dc.w    Date-str_sys
  1028. str_sys:
  1029.  
  1030. Date:
  1031.     IOCS    _DATEGET
  1032.     move.l    d0,d1        * BCD
  1033.     IOCS    _DATEBIN
  1034.     move.l    d0,d1        * binary
  1035.     lsl.l    #4,d1
  1036.     ori.b    #$02,d1        * yy/mm/dd
  1037.     ror.l    #4,d1
  1038.     movea.l    strbuf,a0
  1039.     addi.l    #$100,strbuf
  1040.     move.l    a1,-(sp)
  1041.     movea.l    a0,a1
  1042.     IOCS    _DATEASC
  1043.     move.l    (sp)+,a1
  1044.     rts
  1045.  
  1046. Day:
  1047.     IOCS    _DATEGET
  1048.     swap    d0
  1049.     lsr.w    #8,d0
  1050.     moveq    #0,d1
  1051.     move.b    d0,d1        * 曜日
  1052.     movea.l    strbuf,a0
  1053.     addi.l    #$100,strbuf
  1054.     move.l    a1,-(sp)
  1055.     movea.l    a0,a1
  1056.     IOCS    _DAYASC
  1057.     move.l    (sp)+,a1
  1058.     rts
  1059.  
  1060. Time:
  1061.     IOCS    _TIMEGET
  1062.     move.l    d0,d1        * BCD
  1063.     IOCS    _TIMEBIN
  1064.     move.l    d0,d1        * binary
  1065.     movea.l    strbuf,a0
  1066.     addi.l    #$100,strbuf
  1067.     move.l    a1,-(sp)
  1068.     movea.l    a0,a1
  1069.     IOCS    _TIMEASC
  1070.     move.l    (sp)+,a1
  1071.     rts
  1072.  
  1073. Inkey0:
  1074. Inkey:
  1075.     IERROR    72    * こBでは使えない命令
  1076.  
  1077.  
  1078. normal_str_var:
  1079.     movea.l    変数str,a0        * とりあえず兼用
  1080.     lsl.w    #8,d0
  1081.     lea.l    (a0,d0.w),a0
  1082.     rts
  1083. auto_str_var:
  1084.     move.w    (a5)+,d0
  1085.     movea.l    Astr(a4),a0
  1086.     lsl.w    #8,d0
  1087.     lea.l    (a0,d0.w),a0
  1088.     rts
  1089.  
  1090.  
  1091.  
  1092.  
  1093.  
  1094.  
  1095. str_dim:
  1096.     bsr    dim_sub
  1097.     lsl.l    #8,d0
  1098.     lea.l    (a0,d0.l),a0
  1099.     rts
  1100.  
  1101.  
  1102.  
  1103.  
  1104.  
  1105. sg1:
  1106.     bclr    #14,d0
  1107.     beq    str_imm
  1108.  * str_fnc
  1109.     movem.l    d2-d4/a1,-(sp)
  1110.     bsr    function_call
  1111.     tst.w    (a0)
  1112.     bne    返り値がない
  1113.     movea.l    2+4(a0),a1
  1114.     movea.l    strbuf,a0
  1115.     addi.l    #$100,strbuf
  1116.     move.l    a0,d2        * 保存
  1117. @@:
  1118.     move.b    (a1)+,(a0)+
  1119.     bne    @b
  1120.     movea.l    d2,a0
  1121.     movem.l    (sp)+,d2-d4/a1
  1122.     rts
  1123.  
  1124.  
  1125. str_imm:
  1126.     movea.l    a5,a0
  1127. @@:
  1128.     tst.b    (a5)+
  1129.     bne    @b
  1130.     addq.l    #1,a5
  1131.     move.l    a5,d0
  1132.     bclr    #0,d0
  1133.     movea.l    d0,a5
  1134.     rts
  1135.  
  1136.  
  1137. str_cal:
  1138.     move.w    (a5)+,d0
  1139.     cmpi.w    #5*2,d0        * '+'
  1140.     bne    strに足し算以外
  1141.  
  1142.     movea.l    strbuf,a0
  1143.     addi.l    #$100,strbuf
  1144.  
  1145.     movem.l    a0/a1,-(sp)
  1146.     move.w    #255-1,d1
  1147.     movea.l    a0,a1
  1148.  
  1149.     bsr    str値get
  1150. @@:
  1151.     move.b    (a0)+,(a1)+
  1152.     dbeq    d1,@b
  1153.     subq.l    #1,a1
  1154.  
  1155.     bsr    str値get
  1156. @@:
  1157.     move.b    (a0)+,(a1)+
  1158.     dbeq    d1,@b
  1159.     clr.b    (a1)
  1160.  
  1161.     movem.l    (sp)+,a0/a1
  1162.     rts
  1163.  
  1164.  
  1165.  
  1166.  
  1167.  
  1168.  
  1169. **    **    **    **    **    **
  1170.  
  1171.  
  1172.  
  1173.  
  1174.  
  1175. **    **    **    **    **    **
  1176.  
  1177. int_system_var:
  1178.     cmpi.w    #-10,d0
  1179.     ble    info_sys
  1180.     add.w    d0,d0
  1181.     move.w    int_sys(pc,d0.w),d0
  1182.     jmp    int_sys(pc,d0.w)
  1183.  
  1184.     .dc.w    Itime-int_sys
  1185.     .dc.w    Winv-int_sys
  1186.     .dc.w    Winh-int_sys
  1187.     .dc.w    Winy-int_sys
  1188.     .dc.w    Winx-int_sys
  1189.     .dc.w    Pos-int_sys
  1190.     .dc.w    Free-int_sys
  1191.     .dc.w    Errno-int_sys
  1192.     .dc.w    Csrlin-int_sys
  1193. int_sys:
  1194.  
  1195. info_sys:
  1196.     neg.w    d0
  1197.     lsl.w    #2,d0
  1198. *        .xref    global_info
  1199. *    lea.l    global_info(pc),a0
  1200.     tst.l    Asysvar(a4)        * 遅いけど~
  1201.     beq    info_sys_err
  1202.     move.l    Asysvar(a4),a0        * auto システム変数
  1203.     move.l    -40+4(a0,d0.w),d0    *?
  1204.     rts
  1205.  
  1206. info_sys_err:
  1207.     IERROR    86
  1208.  
  1209. Csrlin:
  1210. Pos:
  1211.     moveq    #0,d0
  1212.     rts
  1213. Free:
  1214.     move.l    mem_last,d0
  1215.     sub.l    変数area,d0
  1216.     rts
  1217. Errno:
  1218.     move.l    errorno,d0
  1219.     rts
  1220. Winx:
  1221.     .xref    _WINX
  1222.     move.l    _WINX(pc),d0
  1223.     rts
  1224. Winy:
  1225.     .xref    _WINY
  1226.     move.l    _WINY(pc),d0
  1227.     rts
  1228. Winh:
  1229.     .xref    _WINH
  1230.     move.l    _WINH(pc),d0
  1231.     rts
  1232. Winv:
  1233.     .xref    _WINV
  1234.     move.l    _WINV(pc),d0
  1235.     rts
  1236. Itime:
  1237.     .xref    _ITIME
  1238.     move.l    _ITIME(pc),d0
  1239.     rts
  1240.  
  1241.  
  1242. int_cal:
  1243.     move.w    (a5)+,d0
  1244.     move.w    ic(pc,d0.w),d0
  1245.     jmp    ic(pc,d0.w)
  1246. ic:
  1247.     .dc.w    0    * dummy
  1248.     .dc.w    Imul-ic
  1249.     .dc.w    Idiv-ic
  1250.     .dc.w    Idiv2-ic
  1251.     .dc.w    Imod-ic
  1252.     .dc.w    Iadd-ic
  1253.     .dc.w    Isub-ic
  1254.     .dc.w    Ishr-ic
  1255.     .dc.w    Ishl-ic
  1256.     .dc.w    Iequal-ic
  1257.     .dc.w    Inoteq-ic
  1258.     .dc.w    Ismall-ic
  1259.     .dc.w    Ilarge-ic
  1260.     .dc.w    Ieq_small-ic
  1261.     .dc.w    Ieq_large-ic
  1262.     .dc.w    Inot-ic
  1263.     .dc.w    Iand-ic
  1264.     .dc.w    Ior-ic
  1265.     .dc.w    Ixor-ic
  1266.     .dc.w    Iminus-ic    * $13
  1267.     .dc.w    0        * reserve $14
  1268.     .dc.w    0        * reserve $15
  1269.     .dc.w    0        * reserve $16
  1270.     .dc.w    0        * reserve $17
  1271.     .dc.w    0        * reserve $18
  1272.     .dc.w    0        * reserve $19
  1273.     .dc.w    0        * reserve $1a
  1274.     .dc.w    0        * reserve $1b
  1275.     .dc.w    0        * reserve $1c
  1276.     .dc.w    0        * reserve $1d
  1277.     .dc.w    0        * reserve $1e
  1278.     .dc.w    0        * reserve $1f
  1279.     .dc.w    Iadd1-ic    * $20
  1280.     .dc.w    Iadd2-ic
  1281.     .dc.w    Iadd3-ic
  1282.     .dc.w    Iadd4-ic
  1283.     .dc.w    Iadd5-ic
  1284.     .dc.w    Iadd6-ic
  1285.     .dc.w    Iadd7-ic
  1286.     .dc.w    Iadd8-ic
  1287.     .dc.w    Isub1-ic    * $28
  1288.     .dc.w    Isub2-ic
  1289.     .dc.w    Isub3-ic
  1290.     .dc.w    Isub4-ic
  1291.     .dc.w    Isub5-ic
  1292.     .dc.w    Isub6-ic
  1293.     .dc.w    Isub7-ic
  1294.     .dc.w    Isub8-ic
  1295.     .dc.w    Imul02-ic    * $30
  1296.     .dc.w    Imul03-ic
  1297.     .dc.w    Imul04-ic
  1298.     .dc.w    Imul05-ic
  1299.     .dc.w    Imul06-ic
  1300.     .dc.w    Imul07-ic
  1301.     .dc.w    Imul08-ic
  1302.     .dc.w    Imul09-ic
  1303.     .dc.w    Imul10-ic
  1304.     .dc.w    Imul11-ic
  1305.     .dc.w    Imul12-ic
  1306.     .dc.w    Imul13-ic
  1307.     .dc.w    Imul14-ic
  1308.     .dc.w    Imul15-ic
  1309.     .dc.w    Imul16-ic
  1310.     .dc.w    0        * reserve $3f
  1311.     .dc.w    Imul32-ic
  1312.     .dc.w    Imul64-ic
  1313.     .dc.w    Imul128-ic
  1314.     .dc.w    Imul256-ic
  1315.     .dc.w    0        * reserve $44
  1316.     .dc.w    0        * reserve $45
  1317.     .dc.w    0        * reserve $46
  1318.     .dc.w    0        * reserve $47
  1319.     .dc.w    Idiv2_1-ic    * $48
  1320.     .dc.w    Idiv2_2-ic
  1321.     .dc.w    Idiv2_3-ic
  1322.     .dc.w    Idiv2_4-ic
  1323.     .dc.w    Idiv2_5-ic
  1324.     .dc.w    Idiv2_6-ic
  1325.     .dc.w    Idiv2_7-ic
  1326.     .dc.w    Idiv2_8-ic
  1327.     .dc.w    Ishr1-ic    * $50
  1328.     .dc.w    Ishr2-ic
  1329.     .dc.w    Ishr3-ic
  1330.     .dc.w    Ishr4-ic
  1331.     .dc.w    Ishr5-ic
  1332.     .dc.w    Ishr6-ic
  1333.     .dc.w    Ishr7-ic
  1334.     .dc.w    Ishr8-ic
  1335.  
  1336.  
  1337. Imul:
  1338. .ifdef    _XB030
  1339.     bsr    int値get
  1340.     move.l    d0,-(sp)
  1341.     bsr    int値get
  1342.     muls.l    (sp)+,d0
  1343. .else
  1344.     move.l    d1,-(sp)
  1345.     bsr    int値get
  1346.     move.l    d0,d1
  1347.     bsr    int値get
  1348.     FPACK    __LMUL
  1349.     move.l    (sp)+,d1
  1350. .endif
  1351.     rts
  1352. Idiv:
  1353. Idiv2:
  1354. .ifdef    _XB030
  1355.     move.l    d1,-(sp)
  1356.     bsr    int値get
  1357.     move.l    d0,d1
  1358.     bsr    int値get
  1359.     tst.l    d0
  1360.     beq    zero_div
  1361.     exg    d0,d1
  1362.     divs.l    d1,d0
  1363.     move.l    (sp)+,d1
  1364. .else
  1365.     move.l    d1,-(sp)
  1366.     bsr    int値get
  1367.     move.l    d0,d1
  1368.     bsr    int値get
  1369.     tst.l    d0
  1370.     beq    zero_div
  1371.     exg    d0,d1
  1372.     FPACK    __LDIV        * 手抜き
  1373.     move.l    (sp)+,d1
  1374. .endif
  1375.     rts
  1376. Imod:
  1377. .ifdef    _XB030
  1378.     move.l    d1,-(sp)
  1379.     bsr    int値get
  1380.     move.l    d0,d1
  1381.     bsr    int値get
  1382.     tst.l    d0
  1383.     beq    zero_div
  1384.     divsl.l    d0,d0:d1
  1385.     move.l    (sp)+,d1
  1386. .else
  1387.     move.l    d1,-(sp)
  1388.     bsr    int値get
  1389.     move.l    d0,d1
  1390.     bsr    int値get
  1391.     tst.l    d0
  1392.     beq    zero_div
  1393.     exg    d0,d1
  1394.     FPACK    __LMOD        * 手抜き
  1395.     move.l    (sp)+,d1
  1396. .endif
  1397.     rts
  1398.  
  1399. Iadd:
  1400.     bsr    int値get
  1401.     move.l    d0,-(sp)
  1402.     bsr    int値get
  1403.     add.l    (sp)+,d0
  1404.     rts
  1405.  
  1406. Isub:
  1407.     move.l    d1,-(sp)
  1408.     bsr    int値get
  1409.     move.l    d0,d1
  1410.     bsr    int値get
  1411.     sub.l    d0,d1
  1412.     move.l    d1,d0
  1413.     move.l    (sp)+,d1
  1414.     rts
  1415.  
  1416. Ishr:
  1417.     move.l    d1,-(sp)
  1418.     bsr    int値get
  1419.     move.l    d0,d1
  1420.     bsr    int値get
  1421.     lsr.l    d0,d1
  1422.     move.l    d1,d0
  1423.     move.l    (sp)+,d1
  1424.     rts
  1425. Ishl:
  1426.     move.l    d1,-(sp)
  1427.     bsr    int値get
  1428.     move.l    d0,d1
  1429.     bsr    int値get
  1430.     lsl.l    d0,d1
  1431.     move.l    d1,d0
  1432.     move.l    (sp)+,d1
  1433.     rts
  1434.  
  1435.  
  1436.  
  1437.     * 実数・文字列の比較の時有り
  1438. 二数比較:
  1439. *    tst.b    d0
  1440.     bmi    二比float
  1441.     subq.b    #2,d0
  1442.     beq    二比char
  1443. *二比str:
  1444.     movem.l    d4/a1,-(sp)
  1445.     bsr    str値get
  1446.     move.l    a0,a1
  1447.     bsr    str値get
  1448. @@:
  1449.     move.b    (a0)+,d0
  1450.     beq    @f
  1451.     cmp.b    (a1)+,d0
  1452.     beq    @b
  1453.     movem.l    (sp)+,d4/a1
  1454.     rts
  1455. @@:
  1456.     cmp.b    (a1),d0
  1457.     movem.l    (sp)+,d4/a1
  1458.     rts
  1459.  
  1460. 二比float:
  1461.     move.w    d4,-(sp)
  1462.     bsr    float値get
  1463.     move.l    d0,d2
  1464.     move.l    d1,d3
  1465.     bsr    float値get
  1466.     move.w    (sp)+,d4
  1467.     FPACK    __DCMP
  1468.     rts
  1469.  
  1470. 二比char:
  1471.     bsr    int値get
  1472.     move.l    d0,d1
  1473.     bsr    int値get
  1474.     cmp.b    d1,d0
  1475.     rts
  1476.  
  1477.  
  1478.  
  1479. Iequal:
  1480.     move.l    d1,-(sp)
  1481.     move.b    1(a5),d0
  1482.     beq    二比int_eq
  1483.     bsr    二数比較
  1484.     beq    true
  1485.     bra    false
  1486. 二比int_eq:
  1487.     bsr    int値get
  1488.     move.l    d0,d1
  1489.     bsr    int値get
  1490.     cmp.l    d1,d0
  1491.     beq    true
  1492.     bra    false
  1493.  
  1494. Inoteq:
  1495.     move.l    d1,-(sp)
  1496.     move.b    1(a5),d0
  1497.     beq    二比int_ne
  1498.     bsr    二数比較
  1499.     bne    true
  1500.     bra    false
  1501. 二比int_ne:
  1502.     bsr    int値get
  1503.     move.l    d0,d1
  1504.     bsr    int値get
  1505.     cmp.l    d1,d0
  1506.     bne    true
  1507.     bra    false
  1508.  
  1509. Ismall:
  1510.     move.l    d1,-(sp)
  1511.     move.b    1(a5),d0
  1512.     beq    @f
  1513.     bsr    二数比較
  1514.     bhi    true
  1515.     bra    false
  1516. @@:
  1517.     bsr    int値get
  1518.     move.l    d0,d1
  1519.     bsr    int値get
  1520.     cmp.l    d1,d0
  1521.     bgt    true
  1522.     bra    false
  1523.  
  1524. Ilarge:
  1525.     move.l    d1,-(sp)
  1526.     move.b    1(a5),d0
  1527.     beq    @f
  1528.     bsr    二数比較
  1529.     bcs    true
  1530.     bra    false
  1531. @@:
  1532.     bsr    int値get
  1533.     move.l    d0,d1
  1534.     bsr    int値get
  1535.     cmp.l    d1,d0
  1536.     blt    true
  1537.     bra    false
  1538.  
  1539. Ieq_small:
  1540.     move.l    d1,-(sp)
  1541.     move.b    1(a5),d0
  1542.     beq    @f
  1543.     bsr    二数比較
  1544.     bcc    true
  1545.     bra    false
  1546. @@:
  1547.     bsr    int値get
  1548.     move.l    d0,d1
  1549.     bsr    int値get
  1550.     cmp.l    d1,d0
  1551.     bge    true
  1552.     bra    false
  1553.  
  1554. Ieq_large:
  1555.     move.l    d1,-(sp)
  1556.     move.b    1(a5),d0
  1557.     beq    @f
  1558.     bsr    二数比較
  1559.     bls    true
  1560.     bra    false
  1561. @@:
  1562.     bsr    int値get
  1563.     move.l    d0,d1
  1564.     bsr    int値get
  1565.     cmp.l    d1,d0
  1566.     ble    true
  1567.     bra    false
  1568.  
  1569. true:
  1570.     moveq    #-1,d0
  1571.     move.l    (sp)+,d1
  1572.     rts
  1573. false:
  1574.     moveq    #0,d0
  1575.     move.l    (sp)+,d1
  1576.     rts
  1577.  
  1578.  
  1579.  
  1580.  
  1581. Inot:
  1582.     bsr    int値get
  1583.     not.l    d0
  1584.     rts
  1585. Iand:
  1586.     bsr    int値get
  1587.     move.l    d0,-(sp)
  1588.     bsr    int値get
  1589.     and.l    (sp)+,d0
  1590.     rts
  1591. Ior:
  1592.     bsr    int値get
  1593.     move.l    d0,-(sp)
  1594.     bsr    int値get
  1595.     or.l    (sp)+,d0
  1596.     rts
  1597. Ixor:
  1598.     move.l    d1,-(sp)
  1599.     bsr    int値get
  1600.     move.l    d0,d1
  1601.     bsr    int値get
  1602.     eor.l    d1,d0
  1603.     move.l    (sp)+,d1
  1604.     rts
  1605. Iminus:
  1606.     bsr    int値get
  1607.     neg.l    d0
  1608.     rts
  1609.  
  1610.     .irpc    ch,12345678
  1611. Iadd&ch:
  1612.     bsr    int値get
  1613.     addq.l    #&ch,d0
  1614.     rts
  1615.     .endm
  1616.  
  1617.     .irpc    ch,12345678
  1618. Isub&ch:
  1619.     bsr    int値get
  1620.     subq.l    #&ch,d0
  1621.     rts
  1622.     .endm
  1623.  
  1624.  
  1625. Idiv2_1:
  1626.     bsr    int値get
  1627.     tst.l    d0
  1628.     bge    @f
  1629.     addq.l    #1,d0
  1630. @@:
  1631.     asr.l    #1,d0
  1632.     rts
  1633. Idiv2_2:
  1634.     bsr    int値get
  1635.     tst.l    d0
  1636.     bge    @f
  1637.     addq.l    #3,d0
  1638. @@:
  1639.     asr.l    #2,d0
  1640.     rts
  1641. Idiv2_3:
  1642.     bsr    int値get
  1643.     tst.l    d0
  1644.     bge    @f
  1645.     addq.l    #7,d0
  1646. @@:
  1647.     asr.l    #3,d0
  1648.     rts
  1649.  
  1650.     .irpc    ch,45678
  1651. Idiv2_&ch:
  1652.     bsr    int値get
  1653.     tst.l    d0
  1654.     bge    @f
  1655.     neg.l    d0
  1656.     asr.l    #&ch,d0
  1657.     neg.l    d0
  1658.     rts
  1659. @@:
  1660.     asr.l    #&ch,d0
  1661.     rts
  1662.     .endm
  1663.  
  1664.     .irpc    ch,12345678
  1665. Ishr&ch:
  1666.     bsr    int値get
  1667.     lsr.l    #&ch,d0
  1668.     rts
  1669.     .endm
  1670.  
  1671. Imul02:
  1672.     bsr    int値get
  1673.     add.l    d0,d0
  1674.     rts
  1675. Imul03:
  1676.     bsr    int値get
  1677.     move.l    d0,-(sp)
  1678.     add.l    d0,d0
  1679.     add.l    (sp)+,d0
  1680.     rts
  1681. Imul04:
  1682.     bsr    int値get
  1683.     lsl.l    #2,d0
  1684.     rts
  1685. Imul05:
  1686.     bsr    int値get
  1687.     move.l    d0,-(sp)
  1688.     lsl.l    #2,d0
  1689.     add.l    (sp)+,d0
  1690.     rts
  1691. Imul06:
  1692.     bsr    int値get
  1693.     add.l    d0,d0
  1694.     move.l    d0,-(sp)
  1695.     add.l    d0,d0
  1696.     add.l    (sp)+,d0
  1697.     rts
  1698. Imul07:
  1699.     bsr    int値get
  1700.     move.l    d0,-(sp)
  1701.     lsl.l    #3,d0
  1702.     sub.l    (sp)+,d0
  1703.     rts
  1704. Imul08:
  1705.     bsr    int値get
  1706.     lsl.l    #3,d0
  1707.     rts
  1708. Imul09:
  1709.     bsr    int値get
  1710.     move.l    d0,-(sp)
  1711.     lsl.l    #3,d0
  1712.     add.l    (sp)+,d0
  1713.     rts
  1714. Imul10:
  1715.     bsr    int値get
  1716.     add.l    d0,d0
  1717.     move.l    d0,-(sp)
  1718.     lsl.l    #2,d0
  1719.     add.l    (sp)+,d0
  1720.     rts
  1721. Imul11:
  1722.     bsr    int値get
  1723.     move.l    d0,-(sp)
  1724.     add.l    d0,d0
  1725.     add.l    d0,(sp)
  1726.     lsl.l    #2,d0
  1727.     add.l    (sp)+,d0
  1728.     rts
  1729. Imul12:
  1730.     bsr    int値get
  1731.     lsl.l    #2,d0
  1732.     move.l    d0,-(sp)
  1733.     add.l    d0,d0
  1734.     add.l    (sp)+,d0
  1735.     rts
  1736. Imul13:
  1737.     bsr    int値get
  1738.     move.l    d0,-(sp)
  1739.     lsl.l    #2,d0
  1740.     add.l    d0,(sp)
  1741.     add.l    d0,d0
  1742.     add.l    (sp)+,d0
  1743.     rts
  1744. Imul14:
  1745.     bsr    int値get
  1746.     add.l    d0,d0
  1747.     move.l    d0,-(sp)
  1748.     lsl.l    #3,d0
  1749.     sub.l    (sp)+,d0
  1750.     rts
  1751. Imul15:
  1752.     bsr    int値get
  1753.     move.l    d0,-(sp)
  1754.     lsl.l    #4,d0
  1755.     sub.l    (sp)+,d0
  1756.     rts
  1757. Imul16:
  1758.     bsr    int値get
  1759.     lsl.l    #4,d0
  1760.     rts
  1761. Imul32:
  1762.     bsr    int値get
  1763.     lsl.l    #5,d0
  1764.     rts
  1765. Imul64:
  1766.     bsr    int値get
  1767.     lsl.l    #6,d0
  1768.     rts
  1769. Imul128:
  1770.     bsr    int値get
  1771.     lsl.l    #7,d0
  1772.     rts
  1773. Imul256:
  1774.     bsr    int値get
  1775.     lsl.l    #8,d0
  1776.     rts
  1777.  
  1778.  
  1779.  
  1780.     .xdef    strに足し算以外
  1781. strに足し算以外:
  1782.     IERROR    2
  1783. zero_div:
  1784.     IERROR    69
  1785.  
  1786.  
  1787.  
  1788.  
  1789.  
  1790.  
  1791.  
  1792.     .xdef    dim_sub
  1793. dim_sub:
  1794.     move.w    (a5)+,d1    * 配列番号
  1795.  
  1796.     btst    #8,d0
  1797.     beq    @f
  1798.     lea.l    Adim(a4),a0
  1799.     bra    dim3
  1800.  
  1801.  
  1802.     .xdef    dim_set_sub
  1803. dim_set_sub:
  1804.     move.w    (a5)+,d1    * 配列番号
  1805.     bge    @f
  1806.     not.w    d1
  1807.     lea.l    Adim(a4),a0        * auto
  1808.     bra    dim3
  1809. @@:
  1810.     movea.l    配列,a0            * global
  1811.  
  1812.  
  1813. dim3:
  1814. .ifdef    _XB030
  1815.     movea.l    (a0,d1.w*4),a0    * 配列ポインタ
  1816. .else
  1817.     lsl.w    #2,d1
  1818.     movea.l    (a0,d1.w),a0    * 配列ポインタ
  1819. .endif
  1820.     move.w    4(a0),d1    * 次元 - 1
  1821.     addq.l    #8,a0
  1822.     beq    one_dim
  1823.  
  1824.                 * 二次元以上の時
  1825.     movem.l    d2-d5/a1,-(sp)
  1826.  
  1827.     move.w    d1,d5
  1828. .ifdef    _XB030
  1829.     lea.l    2(a0,d1.w*2),a1
  1830. .else
  1831.     add.w    d1,d1
  1832.     lea.l    2(a0,d1.w),a1
  1833. .endif
  1834.     moveq    #0,d1
  1835.     bra    dim4
  1836. dim5:
  1837. .ifdef    _XB030
  1838.     mulu.l    (a1)+,d0
  1839.     add.l    d0,d1
  1840. .else
  1841.     move.l    d1,d2
  1842.     move.l    (a1)+,d1
  1843.     FPACK    __UMUL
  1844.     move.l    d0,d1
  1845.     add.l    d2,d1
  1846. .endif
  1847. dim4:
  1848.     move.l    a0,-(sp)
  1849.     bsr    int値get
  1850.     movea.l    (sp)+,a0
  1851.     cmpi.l    #$10000,d0
  1852.     bcc    添え字大きすぎ
  1853.     cmp.w    (a0)+,d0        * 添え字の大きさ
  1854.     bhi    添え字大きすぎ
  1855.     dbra    d5,dim5
  1856.  
  1857.     add.l    d1,d0
  1858.     movea.l    a1,a0
  1859.     movem.l    (sp)+,d2-d5/a1
  1860.     rts
  1861.  
  1862.  
  1863. one_dim:            * 一次元の時
  1864.     move.l    a0,-(sp)
  1865.     bsr    int値get
  1866.     move.l    (sp)+,a0
  1867.     cmpi.l    #$10000,d0
  1868.     bcc    添え字大きすぎ1
  1869.     cmp.w    (a0)+,d0        * 添え字の大きさ
  1870.     bhi    添え字大きすぎ2
  1871.     rts
  1872.  
  1873.  
  1874. 添え字大きすぎ1:
  1875. .if 0
  1876.     move.l    d0,-(sp)
  1877.     bsr    dec_print
  1878.     move.l    #$10000,(sp)
  1879.     bsr    dec_print
  1880.     bra    @f
  1881. .endif
  1882. 添え字大きすぎ2:
  1883. .if 0
  1884.     move.l    d0,-(sp)
  1885.     bsr    dec_print
  1886.     moveq    #0,d1
  1887.     move.w    -2(a0),d1
  1888.     move.l    d1,(sp)
  1889.     bsr    dec_print
  1890. @@:
  1891.     addq.l    #4,sp
  1892. .endif
  1893. 添え字大きすぎ:
  1894.     tst.l    d0
  1895.     bmi    @f
  1896.     IERROR    37
  1897. @@:
  1898.     IERROR    38
  1899.  
  1900.  
  1901.  
  1902.  
  1903.  
  1904.  
  1905.  
  1906.  
  1907.  
  1908.  
  1909.  
  1910.  
  1911.  
  1912.  
  1913.  
  1914.  
  1915.  
  1916.  
  1917.  
  1918.  
  1919. **    **    **    **    **    **    **    **
  1920.  
  1921.  * 各ステートメントごとの処理
  1922.  
  1923.  
  1924.  
  1925.  
  1926. Gosub:        * サポートの予定は未定
  1927.     IERROR    10
  1928.  
  1929.  
  1930. Case:        * 呼ばれるはずのないステートメント
  1931. Default:
  1932.     .xdef    noSTAT
  1933. noSTAT:
  1934.     IERROR    2
  1935.  
  1936.  
  1937.  
  1938.  
  1939. Func:
  1940.     IERROR    76
  1941.  
  1942.  
  1943. ItSet:            * ITIME に代入
  1944.             * info_?? にも代入 (H8/11/11)
  1945.     bsr    int値get
  1946.     move.w    (a5)+,d1
  1947.     bne    @f
  1948.     move.l    d0,_ITIME
  1949.     bra    main_cont
  1950. @@:
  1951.     move.l    Asysvar(a4),d2
  1952.     beq    info_sys_err        * info_?? はイベント関数内でないと使えないよ
  1953.     movea.l    d2,a0
  1954.     lsl.w    #2,d1
  1955.     move.l    d0,(a0,d1.w)
  1956.     bra    main_cont
  1957.  
  1958.  
  1959. SysVar:
  1960.     bsr    str値get
  1961.     tst.w    (a5)+
  1962.     beq    SetDate
  1963. SetTime:
  1964.     movea.l    a0,a1
  1965.     IOCS    _TIMECNV
  1966.     move.l    d0,d1
  1967.     bmi    ireg_set_sysvar
  1968.     IOCS    _TIMEBCD
  1969.     move.l    d0,d1
  1970.     IOCS    _TIMESET
  1971.     bra    main_cont
  1972. SetDate:
  1973.     movea.l    a0,a1
  1974.     IOCS    _DATECNV
  1975.     move.l    d0,d1
  1976.     bmi    ireg_set_sysvar
  1977.     IOCS    _DATEBCD
  1978.     move.l    d0,d1
  1979.     IOCS    _DATESET
  1980.     bra    main_cont
  1981.  
  1982. ireg_set_sysvar:
  1983.     IERROR    70
  1984.  
  1985. Error:
  1986.     tst.w    (a5)+
  1987.     beq    ErrorOff
  1988.     bclr    #errorF,d7
  1989.     bra    main_cont
  1990. ErrorOff:
  1991.     bset    #errorF,d7
  1992.     bra    main_cont
  1993.  
  1994.  
  1995. Key:
  1996.     bsr    int値get
  1997.     tst.w    d0
  1998.     beq    key_err
  1999.     cmpi.w    #20,d0
  2000.     bhi    key_err
  2001.     ori.w    #$100,d0
  2002.     subq.l    #4,sp
  2003.     move.w    d0,-(sp)
  2004.     bsr    str値get
  2005.     move.l    a0,2(sp)
  2006.     DOS    _FNCKEY
  2007.     addq.l    #6,sp
  2008.     bra    main_cont
  2009. key_err:
  2010.     IERROR    64
  2011.  
  2012.  
  2013.  * 文字列ポインタへの代入
  2014. Str:
  2015.     bsr    int値get    * 代入ポインタ
  2016.     move.l    d0,d1
  2017.     cmpi.w    #$100,d1
  2018.     bcc    str_access_err
  2019.     bsr    int値get    * ほんとは char だけど
  2020.     move.w    (a5)+,d2    * str変数番号
  2021.     bge    1f
  2022.     not.w    d2
  2023.     movea.l    Astr(a4),a0
  2024.     bra    2f
  2025. 1:
  2026.     movea.l    変数str,a0        * とりあえず兼用
  2027. 2:
  2028.     lsl.w    #8,d2
  2029.     add.w    d1,d2
  2030.     tst.b    (a0,d2.w)
  2031. *    beq    @f
  2032.     move.b    d0,(a0,d2.w)
  2033.     bra    main_cont
  2034. *@@:
  2035. *    move.b    d0,(a0,d2.w)
  2036. *    clr.b    1(a0,d2.w)    * 文字列の最後だった時のための用心
  2037. *    bra    main_cont
  2038.  
  2039. str_access_err:
  2040.     IERROR    41
  2041.  
  2042.  
  2043.  
  2044.  * 配列の初期化
  2045. Dim:
  2046.                 moveq    #0,d1
  2047.     move.w    (a5)+,d1    * 型
  2048.     bmi    可変長配列定義
  2049.                 *KH    ' 配列の初期化! 型 = ',d1
  2050.     movea.l    配列,a1
  2051.                 moveq    #0,d0
  2052.     move.w    (a5)+,d0    * 配列番号
  2053.                 *KH    ' 配列番号 = ',d0
  2054.                 *tst.w    d0
  2055.     bpl    @f
  2056.     lea.l    Adim(a4),a1
  2057.     not.w    d0
  2058. @@:
  2059.                 *KH    ' 配列情報ポインタリスト = ',a1
  2060.     lsl.w    #2,d0
  2061.     movea.l    (a1,d0.w),a1
  2062.                 *KH    ' 配列情報ポインタ(注目位置) = ',a1
  2063.  
  2064.     move.w    4(a1),d0    * 次元        *<<<<<<<<<< かときちさん報告のバスエラー箇所 (H8/12/10)
  2065.     add.w    d0,d0
  2066.     move.w    d0,d2
  2067.     add.w    d0,d0
  2068.     add.w    d2,d0        * 6倍
  2069.     lea.l    10(a1,d0.w),a1    * データ領域先頭
  2070.     move.w    (a5)+,d2    * 個数 - 1
  2071.  
  2072.     tst.b    d1
  2073.     beq    int_dim_init
  2074.     bmi    float_dim_init
  2075.     subq.b    #1,d1
  2076.     bne    char_dim_init
  2077. str_dim_init:
  2078.     movea.l    a1,a0
  2079. @@:
  2080.     move.b    (a5)+,(a0)+
  2081.     bne    @b
  2082.     lea.l    $100(a1),a1
  2083.     dbra    d2,str_dim_init
  2084.     bra    @f
  2085. char_dim_init:
  2086.     move.b    (a5)+,(a1)+
  2087.     dbra    d2,char_dim_init
  2088. @@:
  2089.     addq.l    #1,a5
  2090.     move.l    a5,d0
  2091.     bclr    #0,d0
  2092.     movea.l    d0,a5
  2093.     bra    main_cont
  2094. float_dim_init:
  2095.     move.l    (a5)+,(a1)+
  2096.     move.l    (a5)+,(a1)+
  2097.     dbra    d2,float_dim_init
  2098.     bra    main_cont
  2099. int_dim_init:
  2100.     move.l    (a5)+,(a1)+
  2101.     dbra    d2,int_dim_init
  2102.     bra    main_cont
  2103.  
  2104.  
  2105.  
  2106.  
  2107. 可変長配列定義:
  2108.     move.w    (a5)+,d0    * 配列番号
  2109.     move.w    (a5)+,d3    * 次元 - 1
  2110.  
  2111.     movea.l    変数area,a1
  2112.     btst    #0,d3
  2113.     bne    @f        * 奇数次元の時に
  2114.     addq.l    #2,a1        * 配列の要素がロングワード境界に来るように小細工
  2115. @@:
  2116.     not.w    d0
  2117.     lsl.w    #2,d0
  2118.     move.l    a1,Adim(a4,d0.w)
  2119.  
  2120.  
  2121.     clr.l    (a1)+        * offset (無効)
  2122.     move.w    d3,(a1)+        * 次元-1
  2123.  
  2124.         bsr    dim_clr_sub1
  2125.  
  2126.     move.w    d3,d1        * 次元 - 1
  2127. @@:
  2128.     bsr    int値get
  2129.     move.w    d0,(a1)+    * 添え字の大きさ
  2130.     swap    d0
  2131.     tst.w    d0
  2132.     bne    添字大きさ不正
  2133.     dbra    d1,@b
  2134.  
  2135.  
  2136.  
  2137.         bsr    dim_clr_sub2
  2138.  
  2139.     lea.l    (a1,d0.l),a0
  2140.     cmpa.l    mem_last,a0
  2141.     bcc    mem_err
  2142.  
  2143.     btst    #v_initF,d7
  2144.     beq    @f
  2145.     andi.b    #$fc,d0
  2146.     adda.l    d0,a1
  2147.     bra    1f
  2148. @@:
  2149.     lsr.l    #2,d0
  2150.     moveq    #0,d1
  2151.     bsr    a1_clr_d0Lx4
  2152. 1:
  2153.     move.l    a1,変数area
  2154.     bra    main_cont
  2155.  
  2156.  
  2157. 添字大きさ不正:
  2158.     IERROR    36
  2159.  
  2160.  
  2161.  
  2162.  
  2163.  
  2164. Switch:
  2165.     bsr    int値get    * 値1
  2166.     adda.l    (a5),a5        *** JUMP ***  switch table
  2167.     move.w    (a5)+,d2    * case の個数 - 1
  2168.     bra    @f
  2169. sw_loop:
  2170.     addq.l    #4,a5
  2171. @@:
  2172.     cmp.l    (a5)+,d0
  2173.     dbeq    d2,sw_loop
  2174.     beq    sw_default
  2175.     addq.l    #4,a5
  2176. sw_default:
  2177.     adda.l    (a5),a5        *** JUMP ***
  2178.     bra    main_cont
  2179.  
  2180.  
  2181.  
  2182.     .xdef    Switch2
  2183. Switch2:
  2184.     bsr    str値get    * 値1
  2185.     moveq    #-2,d0        * 文字列長さ
  2186.     movea.l    a0,a1
  2187. @@:
  2188.     addq.w    #1,d0
  2189.     tst.b    (a1)+
  2190.     bne    @b
  2191.  
  2192.     adda.l    (a5),a5        *** JUMP ***  switch table
  2193.     move.w    (a5)+,d2    * case の個数 - 1
  2194. sw_loop2:
  2195.     move.w    (a5)+,d1    * 文字列長さ
  2196.     cmp.w    d0,d1
  2197.     bne    sw2_out
  2198.     tst.w    d1
  2199.     bmi    sw2_ok
  2200.  
  2201.     movea.l    a0,a1
  2202.     movea.l    a5,a2
  2203. @@:
  2204.     cmp.b    (a1)+,(a2)+
  2205.     dbne    d0,@b
  2206.     bne    sw2_out2
  2207. sw2_ok:
  2208.     addq.w    #3,d1
  2209.     bclr    #0,d1
  2210.     adda.w    d1,a5
  2211.     bra    sw_default
  2212.  
  2213. sw2_out2:
  2214.     move.w    d1,d0        * H9/3/5 switch (文字列) の不都合の原因?
  2215. sw2_out:
  2216.     addq.w    #3+4,d1        * jump address skip
  2217.     bclr    #0,d1
  2218.     adda.w    d1,a5
  2219.     dbra    d2,sw_loop2
  2220.     bra    sw_default
  2221.  
  2222.  
  2223.  
  2224.  
  2225.  
  2226. For:
  2227.     bsr    int値get    * 値1
  2228.     move.l    d0,d1
  2229.  
  2230.     move.w    (a5)+,d0    * 変数番号
  2231.     bmi    for_0
  2232.     movea.l    変数int,a0        * とりあえず兼用
  2233.     bra    @f
  2234. for_0:
  2235.     not.w    d0
  2236.     movea.l    Aint(a4),a0
  2237. @@:
  2238.     lsl.w    #2,d0
  2239.     move.l    d1,(a0,d0.w)
  2240.  
  2241.     bsr    int値get    * 値2
  2242.  
  2243.     cmp.l    d1,d0
  2244.     blt    Break        ; changed from bcs (M.Kamada 95.07.09)
  2245.     addq.l    #4,a5
  2246.     bra    main_cont
  2247.  
  2248.  
  2249. Goto:
  2250. Else:
  2251. Break:
  2252. Continue:
  2253.     adda.l    (a5),a5        *** JUMP ***
  2254.     bra    main_cont
  2255.  
  2256.  
  2257.  
  2258. If:
  2259. While:
  2260. Until:
  2261.     bsr    int値get    * 値1
  2262.     tst.l    d0
  2263.     bne    条件真
  2264.  * 偽
  2265.     adda.l    (a5),a5        *** JUMP ***
  2266.     bra    main_cont
  2267.  
  2268. 条件真:
  2269.     addq.l    #4,a5
  2270.     bra    main_cont
  2271.  
  2272.  
  2273. Ifeq:
  2274.     bsr    int値get    * 値1
  2275.     move.l    d0,d1
  2276.     bsr    int値get    * 値2
  2277.     cmp.l    d0,d1
  2278.     beq    条件真
  2279.     adda.l    (a5),a5        *** JUMP ***
  2280.     bra    main_cont
  2281. Ifne:
  2282.     bsr    int値get    * 値1
  2283.     move.l    d0,d1
  2284.     bsr    int値get    * 値2
  2285.     cmp.l    d0,d1
  2286.     bne    条件真
  2287.     adda.l    (a5),a5        *** JUMP ***
  2288.     bra    main_cont
  2289. Ifgt:
  2290.     bsr    int値get    * 値1
  2291.     move.l    d0,d1
  2292.     bsr    int値get    * 値2
  2293.     cmp.l    d0,d1
  2294.     bgt    条件真
  2295.     adda.l    (a5),a5        *** JUMP ***
  2296.     bra    main_cont
  2297. Ifge:
  2298.     bsr    int値get    * 値1
  2299.     move.l    d0,d1
  2300.     bsr    int値get    * 値2
  2301.     cmp.l    d0,d1
  2302.     bge    条件真
  2303.     adda.l    (a5),a5        *** JUMP ***
  2304.     bra    main_cont
  2305. Iflt:
  2306.     bsr    int値get    * 値1
  2307.     move.l    d0,d1
  2308.     bsr    int値get    * 値2
  2309.     cmp.l    d0,d1
  2310.     blt    条件真
  2311.     adda.l    (a5),a5        *** JUMP ***
  2312.     bra    main_cont
  2313. Ifle:
  2314.     bsr    int値get    * 値1
  2315.     move.l    d0,d1
  2316.     bsr    int値get    * 値2
  2317.     cmp.l    d0,d1
  2318.     ble    条件真
  2319.     adda.l    (a5),a5        *** JUMP ***
  2320.     bra    main_cont
  2321.  
  2322.  
  2323. Endwhile:
  2324.     bsr    int値get    * 値1
  2325.     tst.l    d0
  2326.     beq    条件偽
  2327.  * 真
  2328.     adda.l    (a5),a5        *** JUMP ***
  2329.     bra    main_cont
  2330.  
  2331. 条件偽:
  2332.     addq.l    #4,a5
  2333.     bra    main_cont
  2334.  
  2335.  
  2336. Next2:
  2337.     move.w    (a5)+,d0    * 変数番号
  2338.     bmi    1f
  2339.     movea.l    変数int,a0        * とりあえず兼用
  2340.     bra    @f
  2341. 1:
  2342.     not.w    d0
  2343.     movea.l    Aint(a4),a0
  2344. @@:
  2345.     lsl.w    #2,d0
  2346.     addq.l    #1,(a0,d0.w)
  2347.     move.l    (a0,d0.w),d1
  2348.  
  2349.     cmp.l    (a5)+,d1        * 特別
  2350.     bgt    for_loop終わった
  2351.     adda.l    (a5),a5        *** JUMP ***
  2352.     bra    main_cont
  2353.  
  2354. Next:
  2355.     move.w    (a5)+,d0    * 変数番号
  2356.     bmi    next0
  2357.     movea.l    変数int,a0        * とりあえず兼用
  2358.     bra    @f
  2359. next0:
  2360.     not.w    d0
  2361.     movea.l    Aint(a4),a0
  2362. @@:
  2363.     lsl.w    #2,d0
  2364.     addq.l    #1,(a0,d0.w)
  2365.     move.l    (a0,d0.w),d1
  2366.  
  2367.     bsr    int値get    * 値2
  2368.  
  2369.     cmp.l    d0,d1
  2370.     bgt    for_loop終わった
  2371.     adda.l    (a5),a5        *** JUMP ***
  2372.     bra    main_cont
  2373.  
  2374. for_loop終わった:
  2375.     addq.l    #4,a5
  2376.     bra    main_cont
  2377.  
  2378.  
  2379.  
  2380.  
  2381.  
  2382.  
  2383.  
  2384.  
  2385.  
  2386.  * こBで使えない命令
  2387. Console:
  2388. FuncKey:
  2389. Width:
  2390. Color:
  2391. Locate:
  2392. Cls:
  2393. Input:
  2394. Linput:
  2395. CursorSW:
  2396.     IERROR    72    * こBでは使えない命令
  2397.  
  2398.  
  2399.  
  2400. console_para_err:
  2401.     IERROR    53
  2402. func_mode_error:
  2403.     IERROR    73
  2404.  
  2405.  
  2406.  
  2407.  
  2408.  
  2409. Screen:                * こB(H8/2/14)
  2410.     bsr    int値get
  2411.     cmpi.l    #7,d0
  2412.     bhi    screen_mode_error
  2413.     move.l    d0,-(sp)
  2414.     .xref    _WindowSetScreenMode
  2415.     bsr    _WindowSetScreenMode
  2416.     addq.l    #4,sp
  2417. screen_end:
  2418.     tas    sinitFLAG    *bset #7
  2419.     bra    main_cont
  2420.  
  2421.  
  2422. screen_mode_error:
  2423.     IERROR    71            * モードが異常
  2424.  
  2425.  
  2426.  
  2427.  
  2428.  
  2429. ColorP:
  2430.     moveq    #0,d1    * text color
  2431.     moveq    #4-1,d3
  2432. @@:
  2433.     tst.w    (a5)+
  2434.     bne    1f
  2435.     move.w    d3,-(sp)
  2436.     bsr    int値get
  2437.     move.l    d0,d2
  2438.     IOCS    _TPALET
  2439.     move.w    (sp)+,d3
  2440. 1:
  2441.     addq.w    #1,d1
  2442.     bset    #6,sinitFLAG        * 1回でも変更したらセット
  2443.     dbra    d3,@b
  2444.     bra    main_cont
  2445.  
  2446.  
  2447.  
  2448.  
  2449.  
  2450. Beep:
  2451.     pea.l    _beep(pc)
  2452.     KO_PRINT
  2453.     addq.l    #4,sp
  2454.     bra    main_cont
  2455.  
  2456.  
  2457.  
  2458.  
  2459.  
  2460.  
  2461. Lprint:
  2462.     move.w    #4,-(sp)    * prn
  2463.     bset    #localF,d7
  2464.     bra    @f
  2465. Print:
  2466.     bclr    #localF,d7
  2467. @@:
  2468.     move.w    (a5)+,d4
  2469.     bge    print_ctrl
  2470.     bsr    値get
  2471.  
  2472.     tst.b    d4
  2473.     beq    int_print
  2474.     bmi    float_print
  2475.     subq.b    #1,d4
  2476.     beq    str_print
  2477. *char_print:
  2478. int_print:
  2479.     lea.l    tmp,a0
  2480.     move.l    a0,-(sp)
  2481.     move.b    #$20,(a0)+
  2482.     FPACK    __LTOS
  2483.     move.b    #$20,(a0)+
  2484.     clr.b    (a0)
  2485.     KO_PRINT
  2486.     addq.l    #4,sp
  2487.     bra    Print
  2488. *    move.l    d0,-(sp)
  2489. *    bsr    dec_print
  2490. *    addq.l    #4,sp
  2491. *    bra    Print
  2492.  
  2493. float_print:
  2494.     lea.l    tmp,a0
  2495.     move.l    a0,-(sp)
  2496.     move.b    #$20,(a0)+
  2497.     FPACK    __DTOS
  2498.     move.b    #$20,(a0)+
  2499.     clr.b    (a0)
  2500.     KO_PRINT
  2501.     addq.l    #4,sp
  2502.     bra    Print
  2503.  
  2504. str_print:
  2505.     movea.l    a0,a1
  2506.     moveq    #-1,d2
  2507.     moveq    #$20,d1
  2508.     moveq    #0,d0
  2509. ccloop:
  2510.     addq.w    #1,d2
  2511.     move.b    (a1)+,d0
  2512.     beq    ctrlcodeなし
  2513.     cmp.b    d1,d0
  2514.     bcc    ccloop
  2515.  
  2516.     add.w    d0,d0
  2517.     move.w    _cc(pc,d0.w),d0
  2518.     beq    ccloop
  2519.  
  2520.     lea.l    tmp,a1
  2521.     move.l    a1,-(sp)
  2522.     subq.w    #1,d2
  2523.     bcs    kokop3
  2524. @@:
  2525.     move.b    (a0)+,(a1)+
  2526.     dbra    d2,@b
  2527. kokop3:
  2528.     lea.l    _cc(pc,d0.w),a2
  2529. @@:
  2530.     move.b    (a2)+,(a1)+
  2531.     bne    @b
  2532.     clr.b    (a1)
  2533.     KO_PRINT
  2534.     addq.l    #4,sp
  2535.  
  2536.     addq.l    #1,a0
  2537.     bra    str_print
  2538. _cc:
  2539.     .dc.w    0        * 00
  2540.     .dc.w    0
  2541.     .dc.w    0
  2542.     .dc.w    0
  2543.     .dc.w    0
  2544.     .dc.w    0
  2545.     .dc.w    0
  2546.     .dc.w    0
  2547.     .dc.w    0    * 08
  2548.     .dc.w    cc_tab-_cc
  2549.     .dc.w    cc_lf-_cc
  2550.     .dc.w    cc_home-_cc    * 0b
  2551.     .dc.w    cc_clr-_cc    * 0c
  2552.     .dc.w    cc_cr-_cc
  2553.     .dc.w    0
  2554.     .dc.w    0    *cc_Rdown-_cc
  2555.     .dc.w    0    *cc_Rup-_cc
  2556.     .dc.w    0
  2557.     .dc.w    0
  2558.     .dc.w    0
  2559.     .dc.w    0
  2560.     .dc.w    0
  2561.     .dc.w    0
  2562.     .dc.w    0
  2563.     .dc.w    0    * 18
  2564.     .dc.w    0
  2565.     .dc.w    cc_Cj-_cc    * 1a
  2566.     .dc.w    cc_ESC-_cc
  2567.     .dc.w    cc_r-_cc    * 1c
  2568.     .dc.w    cc_l-_cc    * 1d
  2569.     .dc.w    cc_u-_cc    * 1e
  2570.     .dc.w    cc_d-_cc    * 1f
  2571.  
  2572. cc_tab:        .dc.b    9,0
  2573. cc_lf:        .dc.b    $a,0
  2574. cc_home:    .dc.b    $1e,0
  2575. cc_clr:        .dc.b    $1a,0
  2576. cc_cr:        .dc.b    $d,0
  2577. cc_Cj:        .dc.b    $1b,'[J',0
  2578. cc_ESC        .dc.b    $1b,0
  2579. cc_r:        .dc.b    $1b,'[C',0
  2580. cc_l:        .dc.b    $1b,'[D',0
  2581. cc_u:        .dc.b    $b,0
  2582. cc_d:        .dc.b    $1b,'[B',0
  2583. *cc_crlf:    .dc.b    $d,$a,0
  2584. *cc_Rup:    .dc.b    $1b,'[s',$1b,'[32;H',$a,$1b,'[u',$1b,'[L',0
  2585. *cc_Rdown:    .dc.b    $1b,'[L',0
  2586.     .even
  2587.  
  2588. ctrlcodeなし:
  2589.     move.l    a0,-(sp)
  2590.     KO_PRINT
  2591.     addq.l    #4,sp
  2592.     bra    Print
  2593.  
  2594.  
  2595.  
  2596. print_ctrl:
  2597.     move.w    _pc(pc,d4.w),d4
  2598.     jmp    _pc(pc,d4.w)
  2599. _pc:
  2600.     .dc.w    crlf_end-_pc
  2601.     .dc.w    print_end-_pc
  2602.     .dc.w    tab-_pc
  2603.     .dc.w    using_num-_pc
  2604.     .dc.w    using_str-_pc
  2605.  
  2606.  
  2607. using_str:
  2608.     bsr    str値get
  2609.     lea.l    tmp,a1
  2610.     move.l    a1,-(sp)
  2611.     move.w    (a5)+,d0
  2612. @@:
  2613.     move.b    (a0)+,(a1)+
  2614.     dbeq    d0,@b
  2615.     bne    us_str_調整いらず
  2616.     subq.l    #1,a1
  2617. @@:
  2618.     move.b    #$20,(a1)+    * 後ろ余った時の調整
  2619.     dbra    d0,@b
  2620. us_str_調整いらず:
  2621.     clr.b    (a1)
  2622.     bra    using_common
  2623.  
  2624. using_num:
  2625.     bsr    float値get
  2626.  
  2627.     lea.l    tmp,a0
  2628.     move.l    a0,-(sp)
  2629.  
  2630. *    move.w    (a5)+,d2
  2631. *    move.w    (a5)+,d3
  2632. *    move.w    (a5)+,d4
  2633. *    ext.l    d2
  2634. *    ext.l    d3
  2635. *    ext.l    d4
  2636.     movem.w    (a5)+,d2/d3/d4    *符号拡張するのでこれでOK by Eriko
  2637.     FPACK    __USING
  2638. using_common:
  2639.     KO_PRINT
  2640.     addq.l    #4,sp
  2641.     bra    Print
  2642.  
  2643.  
  2644. tab:
  2645.     pea.l    _tab(pc)
  2646.     KO_PRINT
  2647.     addq.l    #4,sp
  2648.     bra    Print
  2649.  
  2650. crlf_end:
  2651.     pea.l    _crlf(pc)
  2652.     KO_PRINT
  2653.     addq.l    #4,sp
  2654. print_end:
  2655.     tst.w    d7
  2656.     bge    main_cont
  2657.     addq.l    #2,sp        * prn
  2658.     bra    main_cont
  2659.  
  2660.  
  2661.  
  2662.  
  2663.  
  2664. ここまでprint:
  2665.     subq.w    #1,d2
  2666.     bcs    kokop1
  2667.     lea.l    tmp,a1
  2668.     move.l    a1,-(sp)
  2669. @@:
  2670.     move.b    (a0)+,(a1)+
  2671.     dbra    d2,@b
  2672.     clr.b    (a1)
  2673.     KO_PRINT
  2674.     addq.l    #4,sp
  2675. kokop1:
  2676.     addq.l    #1,a0
  2677.     rts
  2678.  
  2679.  
  2680. _crlf:
  2681.     .dc.b    13,10,0
  2682. _tab:
  2683.     .dc.b    9,0
  2684. _beep:
  2685.     .dc.b    7,0
  2686.     .even
  2687.  
  2688.  
  2689.  
  2690.  
  2691.  
  2692.  
  2693.  
  2694.  
  2695. Return:
  2696.     move.l    orgstrbuf(a4),strbuf
  2697.     move.w    (a5)+,d4
  2698.     move.w    d4,-(sp)
  2699.     bsr    値get
  2700.     lea.l    ret_dat(pc),a1
  2701.     move.w    (sp)+,d4
  2702.     beq    intRET
  2703.     tst.b    d4
  2704.     bmi    floatRET
  2705.     subq.w    #2,d4
  2706.     beq    intRET        * ほんとは char だけど
  2707. *strRET:
  2708.     move.l    a0,6(a1)
  2709.     bra    _ret
  2710.  
  2711. floatRET:
  2712.     movem.l    d0-d1,2(a1)
  2713.     bra    _ret
  2714.  
  2715. intRET:
  2716.     move.l    d0,6(a1)
  2717.     move.l    d0,returnNUM
  2718.     bra    _ret
  2719.  
  2720. Endfunc:
  2721.     move.l    orgstrbuf(a4),strbuf
  2722.     lea.l    no_ret_dat(pc),a1
  2723.     moveq    #1,d0            * H8/9/2 引き数省略はデフォルトで 1(=デフォルトのイベント処理を行わない)を返す
  2724.     move.l    d0,returnNUM
  2725. _ret:
  2726.     movea.l    a1,a0
  2727.     bra    _kob_driven_end
  2728.  
  2729.  
  2730.     .align    4
  2731. no_ret_dat:
  2732.     .dc.w    -1
  2733. ret_dat:
  2734.     .dc.w    0
  2735.     .dc.l    0,0
  2736.  
  2737.  
  2738.  
  2739. Stop:
  2740.     IERROR    54
  2741. Exit:                * プログラム実行を終了する
  2742.     bsr    int値get
  2743.     move.w    d0,EXITcode
  2744.     bra    _kob_exec_err    * H8/9/1
  2745. End:                * こっちは「グローバルブロックの終了」
  2746.     bra    _kob_driven_end
  2747.  
  2748.  
  2749. **    **    **    **    **    **    **    **    **
  2750.  
  2751.  
  2752.  
  2753.  
  2754.  
  2755.  * d4.b = 型
  2756.     .xdef    function_call
  2757. function_call:
  2758.     move.w    (a5)+,d2    * 引き数の個数
  2759.     move.w    d2,d0
  2760.     lsl.w    #4,d0        * いっぱい余るけどいいよね
  2761.     neg.w    d0
  2762.     lea.l    -4*(3+5)-2(sp,d0.w),sp
  2763.         *レジスタ退避+引き数の個数+引き数(10*個数)
  2764.     movea.l    sp,a1
  2765.  
  2766.     move.w    d2,(a1)+    * 引き数の個数
  2767.  
  2768.     subq.w    #1,d2
  2769.     bcs    fnc_call_loop_end
  2770. fnc_call_loop:
  2771.     move.w    (a5)+,d4
  2772.     bmi    引き数は式
  2773.     btst    #$e,d4
  2774.     bne    引き数は配列
  2775.     cmpi.b    #$ff,d4
  2776.     beq    引き数は省略
  2777.     IERROR    18
  2778.  
  2779.  
  2780. 引き数は省略:
  2781.     move.w    #$ffff,(a1)+
  2782.     addq.l    #8,a1
  2783.     bra    fnc_call_cont
  2784.  
  2785.  
  2786.  
  2787. 引き数は配列:
  2788.     btst    #$d,d4
  2789.     bne    引き数はポインタ
  2790.  
  2791.     btst    #8,d4
  2792.     bne    引き数はauto配列
  2793.  
  2794.     movea.l    配列,a0
  2795.     bra    @f
  2796. 引き数はauto配列:
  2797.     lea.l    Adim(a4),a0
  2798. @@:
  2799.     move.w    (a5)+,d0
  2800.     lsl.w    #2,d0
  2801.  
  2802.     clr.w    (a1)+            * これでいい?  調べないと
  2803.     addq.l    #4,a1
  2804.     move.l    (a0,d0.w),(a1)+
  2805.     bra    fnc_call_cont
  2806.  
  2807.  
  2808. 引き数はポインタ:
  2809.     moveq    #0,d0
  2810.     move.w    (a5)+,d0
  2811.     tst.b    d4
  2812.     beq    intPT
  2813.     bmi    floatPT
  2814.     cmpi.b    #1,d4
  2815.     bne    charPT
  2816. strPT:
  2817.     lsl.l    #8,d0
  2818.     btst    #8,d4
  2819.     bne    strPTA
  2820.     movea.l    変数str,a0
  2821.     bra    @f
  2822. strPTA:
  2823.     movea.l    Astr(a4),a0
  2824.     bra    @f
  2825.  
  2826. charPT:
  2827.     btst    #8,d4
  2828.     bne    charPTA
  2829.     movea.l    変数char,a0
  2830.     bra    @f
  2831. charPTA:
  2832.     movea.l    Achar(a4),a0
  2833.     bra    @f
  2834.  
  2835. floatPT:
  2836.     lsl.l    #3,d0
  2837.     btst    #8,d4
  2838.     bne    floatPTA
  2839.     movea.l    変数float,a0
  2840.     bra    @f
  2841. floatPTA:
  2842.     movea.l    Afloat(a4),a0
  2843.     bra    @f
  2844.  
  2845. intPT:
  2846.     lsl.l    #2,d0
  2847.     btst    #8,d4
  2848.     bne    intPTA
  2849.     movea.l    変数int,a0
  2850.     bra    @f
  2851. intPTA
  2852.     movea.l    Aint(a4),a0
  2853.  
  2854. @@:
  2855.     adda.l    d0,a0
  2856.     clr.w    (a1)+            * これでいい?  調べないと
  2857.     addq.l    #4,a1
  2858.     move.l    a0,(a1)+
  2859.  
  2860.     bra    fnc_call_cont
  2861.  
  2862.  
  2863.  
  2864. 引き数は式:
  2865.     tst.b    d4
  2866.     beq    intP
  2867.     bmi    floatP
  2868.     subq.b    #1,d4
  2869.     bne    charP        * char
  2870. strP:
  2871.     moveq    #1,d4
  2872.     move.w    d2,-(sp)
  2873.     bsr    値get
  2874.     move.w    (sp)+,d2
  2875.  
  2876.     move.w    #3,(a1)+    * str
  2877.     addq.l    #4,a1
  2878. *    clr.l    (a1)+
  2879.     move.l    a0,(a1)+
  2880.     bra    fnc_call_cont
  2881. charP:        * char
  2882.     move.w    #2,(a1)+    * char
  2883.     bra    @f
  2884. floatP:
  2885.     move.w    d2,-(sp)
  2886.     bsr    値get
  2887.     move.w    (sp)+,d2
  2888.     clr.w    (a1)+        * float
  2889.     move.l    d0,(a1)+
  2890.     move.l    d1,(a1)+
  2891.     bra    fnc_call_cont
  2892. intP:
  2893.     move.w    #1,(a1)+    * int
  2894. @@:
  2895.     move.w    d2,-(sp)
  2896.     bsr    int値get
  2897.     move.w    (sp)+,d2
  2898.     addq.l    #4,a1
  2899. *    clr.l    (a1)+
  2900.     move.l    d0,(a1)+
  2901.  
  2902.  
  2903. fnc_call_cont:
  2904.     dbra    d2,fnc_call_loop
  2905. fnc_call_loop_end:
  2906.     move.w    (a5)+,d0            * 関数番号
  2907.     bmi    内部関数呼出
  2908.     lsl.w    #4,d0
  2909.     movea.l    関数buf,a0
  2910.     movea.l    $c(a0,d0.w),a0        * 関数実行アドレス
  2911.     *    KH    ' 関数実行アドレス = ',a0
  2912.  
  2913.  
  2914.     move.w    (sp),d2        * 引き数の個数
  2915.     lsl.w    #4,d2        * いっぱい余るけどいいよね
  2916.     movem.l    d5-d7/a2-a6,2(sp,d2.w)
  2917.  
  2918.     move.l    Asysvar(a4),func参照sysvar
  2919.     .xref    _bwp
  2920.     lea.l    _bwp,a3
  2921.     lea.l    _call(pc),a4
  2922.     jsr    (a0)                * 関数呼び出し
  2923.  
  2924.     move.w    (sp),d2        * 引き数の個数
  2925.     lsl.w    #4,d2        * いっぱい余るけどいいよね
  2926.     lea.l    2(sp,d2.w),sp
  2927.     movem.l    (sp)+,d5-d7/a2-a6
  2928.  
  2929.     move.l    d0,errorno
  2930.     beq    無事実行
  2931.     btst    #errorF,d7
  2932.     beq    外部func_err
  2933.     lea.l    dummy_fac(pc),a0    * 返り値を用意していない関数用?
  2934. 無事実行:
  2935.     rts
  2936.  
  2937.     .xref    _WindowDraw
  2938. _call:
  2939.     .dc.l    _WindowDraw
  2940. func参照sysvar::
  2941.     .dc.l    0
  2942.  
  2943. 外部func_err:
  2944.     tst.b    (a1)
  2945.     beq    @f
  2946.         move.l    a1,-(sp)
  2947.         KO_PRINT
  2948.         addq.l    #4,sp
  2949.     1:
  2950.         tst.b    (a1)+
  2951.         bne    1b
  2952.         cmpi.b    #$0a,-2(a1)
  2953.         beq    @f
  2954.         pea.l    _crlf(pc)
  2955.         KO_PRINT
  2956.         addq.l    #4,sp
  2957. @@:
  2958.     IERROR    20
  2959.  
  2960.  
  2961. dummy_fac:
  2962.     .dc.w    0
  2963.     .dc.l    0,-1        * error の時の返り値
  2964.  
  2965.  
  2966. 内部関数呼出:
  2967.     not.w    d0
  2968.  
  2969.     lsl.w    #4,d0
  2970.     movea.l    内部関数buf,a0
  2971.     movea.l    変数area,a2        * 保存
  2972.  
  2973.     move.w    (sp),d2        * 引き数の個数
  2974.     lsl.w    #4,d2        * いっぱい余るけどいいよね
  2975.     movem.l    d5-d7/a2-a6,2(sp,d2.w)
  2976.  
  2977.     move.l    $c(a0,d0.w),-(sp)        * 関数実行アドレス
  2978.     beq    内部関数のアドレスなし
  2979.     clr.l    -(sp)                * auto システム変数
  2980.     bset    #modeF,d7            * 内部関数フラグセット
  2981.     bsr    _kob_exec            * 関数呼び出し
  2982.  
  2983.     move.w    4+4(sp),d2        * 引き数の個数
  2984.     lsl.w    #4,d2        * いっぱい余るけどいいよね
  2985.     lea.l    4+4+2(sp,d2.w),sp
  2986.     movem.l    (sp)+,d5-d7/a2-a6
  2987.     move.l    a2,変数area
  2988.  
  2989.     rts
  2990.  
  2991.  
  2992. 内部関数のアドレスなし:
  2993.     IERROR    2
  2994.  
  2995.  
  2996.  
  2997.  
  2998.  
  2999.  
  3000.  
  3001.  
  3002.  
  3003.  
  3004.  
  3005.  
  3006.  
  3007.  
  3008.  
  3009.  
  3010.  
  3011.  
  3012.  
  3013. **    **    **    **    **    **    **    **
  3014.  
  3015.  
  3016.  
  3017.  
  3018.  
  3019.  
  3020.  
  3021.  
  3022.     .offset    4
  3023. Fint:    .ds.l    1
  3024. Fstr:    .ds.l    1
  3025. Fchar:    .ds.l    1
  3026. Ffloat:    .ds.l    1
  3027. Fdim:    .ds.l    1
  3028. F引数:    .ds.l    1
  3029.     .text
  3030.  
  3031. Variable_clr_sub:
  3032.     move.l    (a0)+,d0    * 変数領域サイズ
  3033.     lea.l    (a1,d0.l),a2
  3034.     cmpa.l    mem_last,a2
  3035.     bcc    mem_err
  3036.  
  3037.     btst    #v_initF,d7
  3038.     beq    1f
  3039.  
  3040.         movea.l    Fint(sp),a2
  3041.         move.l    a1,(a2)
  3042.         move.w    (a0)+,d0    * int
  3043.         addq.w    #1,d0
  3044.         lsl.w    #2,d0
  3045.         adda.w    d0,a1
  3046.  
  3047.         movea.l    Fstr(sp),a2
  3048.         move.l    a1,(a2)
  3049.         move.w    (a0)+,d0    * str
  3050.         addq.w    #1,d0
  3051.         lsl.w    #8,d0        * 128 個までしかできないけど大丈夫?
  3052.         adda.w    d0,a1
  3053.  
  3054.         movea.l    Fchar(sp),a2
  3055.         move.l    a1,(a2)
  3056.         move.w    (a0)+,d0    * char
  3057.         addq.w    #1+3,d0
  3058.         andi.w    #$fffc,d0
  3059.         adda.w    d0,a1
  3060.  
  3061.         movea.l    Ffloat(sp),a2
  3062.         move.l    a1,(a2)
  3063.         move.w    (a0)+,d0    * float
  3064.         addq.w    #1,d0
  3065.         lsl.w    #2,d0
  3066.         adda.w    d0,a1
  3067.  
  3068.         bra    @f
  3069.  
  3070. 1:
  3071.     moveq    #0,d1
  3072.  
  3073.         movea.l    Fint(sp),a2
  3074.         move.l    a1,(a2)
  3075.         move.w    (a0)+,d0    * int
  3076.         addq.w    #1,d0
  3077.         bsr    a1_clr_d0x4
  3078.  
  3079.         movea.l    Fstr(sp),a2
  3080.         move.l    a1,(a2)
  3081.         move.w    (a0)+,d0    * str
  3082.         addq.w    #1,d0
  3083.         lsl.w    #8-2,d0
  3084.         bsr    a1_clr_d0x4
  3085.  
  3086.         movea.l    Fchar(sp),a2
  3087.         move.l    a1,(a2)
  3088.         move.w    (a0)+,d0    * char
  3089.         addq.w    #1+3,d0
  3090.         lsr.w    #2,d0
  3091.         bsr    a1_clr_d0x4
  3092.  
  3093.         movea.l    Ffloat(sp),a2
  3094.         move.l    a1,(a2)
  3095.         move.w    (a0)+,d0    * float
  3096.         addq.w    #1,d0
  3097.         add.w    d0,d0
  3098.         bsr    a1_clr_d0x4
  3099.  
  3100. @@:
  3101.  
  3102.  
  3103. 配列初期:
  3104.     movea.l    Fdim(sp),a2
  3105.     move.l    a2,d0
  3106.  
  3107.     move.w    (a0)+,d4        * 配列の個数 - 1
  3108.     bmi    配列初期end
  3109.  
  3110. 配列初期loop:
  3111.     moveq    #0,d3
  3112.     move.b    (a0)+,d3    * 次元 - 1
  3113.     move.b    (a0)+,d1    * 型
  3114.  
  3115.     btst    #0,d3
  3116.     bne    @f        * 奇数次元の時に
  3117.     addq.l    #2,a1        * 配列の要素がロングワード境界に来るように小細工
  3118. @@:
  3119.  
  3120.     move.l    a1,(a2)+    * 配列ポインタ
  3121.  
  3122.     clr.l    (a1)+        * offset (無効)
  3123.     move.w    d3,(a1)+        * 次元
  3124.  
  3125.         bsr    dim_clr_sub1
  3126.  
  3127.     move.w    d3,d1        * 次元 - 1
  3128. @@:
  3129.     move.w    (a0)+,(a1)+    * 添え字の大きさ
  3130.     dbra    d1,@b
  3131.  
  3132.  
  3133.         bsr    dim_clr_sub2
  3134.  
  3135.     btst    #v_initF,d7
  3136.     beq    1f
  3137.     andi.b    #$fc,d0
  3138.     adda.l    d0,a1
  3139.     bra    配列初期cont
  3140.  
  3141. 1:
  3142.     lsr.l    #2,d0
  3143.     moveq    #0,d1
  3144.     bsr    a1_clr_d0Lx4
  3145.  
  3146.  
  3147. 配列初期cont:
  3148.     dbra    d4,配列初期loop
  3149.  
  3150. 配列初期end:
  3151.     move.l    a1,変数area
  3152.  
  3153.  
  3154.  
  3155. **    **    **    **
  3156.  
  3157.  * 引き数のセット
  3158.     movea.l    4+引数INIT,a0
  3159.     adda.w    (a5)+,a0    * 引き数リストの先頭アドレス
  3160.  
  3161.     move.w    (a0)+,d3    * 引き数個数 - 1
  3162.     bmi    引き数setend
  3163.  
  3164.     movea.l    F引数(sp),a1
  3165.  
  3166.     addq.l    #2,a1        * stack に積んである引き数の先頭(引き数の個数飛ばす)
  3167. 引き数setloop:
  3168.     move.w    (a0)+,d0    * 型
  3169.     bmi    @f
  3170.         move.w    (a0)+,d2    * 配列番号
  3171.         movea.l    Fdim(sp),a2
  3172.         lsl.w    #2,d2
  3173.         move.l    6(a1),(a2,d2.w)    * 配列ポインタ
  3174.         bra    引き数setcont
  3175. @@:
  3176.     move.w    (a0)+,d2    * 番号
  3177.  
  3178.     tst.b    d0
  3179.     beq    int引数
  3180.     bmi    float引数
  3181.     subq.b    #1,d0
  3182.     beq    str引数
  3183.  * char
  3184.     movea.l    Fchar(sp),a2
  3185.     movea.l    (a2),a2
  3186.     move.b    6+3(a1),(a2,d2.w)
  3187.     bra    引き数setcont
  3188.  
  3189.  
  3190. str引数:
  3191.     movea.l    Fstr(sp),a2
  3192.     lsl.w    #8,d2
  3193.     movea.l    (a2),a2
  3194.     lea.l    (a2,d2.w),a2
  3195.     move.l    a0,-(sp)
  3196.     movea.l    6(a1),a0
  3197. @@:
  3198.     move.b    (a0)+,(a2)+
  3199.     bne    @b
  3200.     move.l    (sp)+,a0
  3201.     bra    引き数setcont
  3202.  
  3203. float引数:
  3204.     movea.l    Ffloat(sp),a2
  3205.     lsl.w    #3,d2
  3206.     movea.l    (a2),a2
  3207.     move.l    2(a1),(a2,d2.w)
  3208.     move.l    6(a1),4(a2,d2.w)
  3209.     bra    引き数setcont
  3210.  
  3211. int引数:
  3212.     movea.l    Fint(sp),a2
  3213.     lsl.w    #2,d2
  3214.     movea.l    (a2),a2
  3215.     move.l    6(a1),(a2,d2.w)
  3216.  
  3217. 引き数setcont:
  3218.     lea.l    10(a1),a1
  3219.     dbra    d3,引き数setloop
  3220.  
  3221. 引き数setend:
  3222.     rts
  3223.  
  3224.  
  3225.  
  3226.  
  3227.  
  3228. dim_clr_sub1:
  3229.     moveq    #4,d0        * 各項のデータサイズを見る
  3230.     moveq    #2,d2        * size (shift)
  3231.     tst.b    d1        * 型
  3232.     beq    1f
  3233.     bmi    2f    * float
  3234.     subq.b    #1,d1
  3235.     beq    3f    * str
  3236.  
  3237.     moveq    #1,d0        * char
  3238.     moveq    #0,d2
  3239.     bra    1f
  3240. 3:
  3241.     move.w    #$100,d0    * str
  3242.     moveq    #8,d2
  3243.     bra    1f
  3244. 2:
  3245.     moveq    #8,d0        * float
  3246.     moveq    #3,d2
  3247. 1:
  3248.     move.w    d0,(a1)+    * 各項のデータサイズ(1 or 4 or 8 or 256)
  3249.     rts
  3250.  
  3251.  
  3252. dim_clr_sub2:
  3253.     move.w    d3,d1        * 次元 - 1
  3254.     lsl.w    #2,d1
  3255.     lea.l    (a1,d1.w),a3
  3256.     move.l    a3,-(sp)
  3257.  
  3258.     moveq    #1,d0
  3259.     bra    1f
  3260. @@:
  3261.     move.l    d0,-(a3)    * 配列計算用のオフセット
  3262. 1:
  3263.     moveq    #0,d1
  3264.     move.w    -(a1),d1
  3265.     addq.l    #1,d1
  3266.     FPACK    __UMUL
  3267.     dbra    d3,@b
  3268.  
  3269.     movea.l    (sp)+,a1
  3270.  
  3271.     lsl.l    d2,d0
  3272.     addq.l    #3,d0        * 忘れてた
  3273.     rts
  3274.  
  3275.  
  3276.  
  3277.  
  3278. a1_clr_d0Lx4:
  3279.     subq.l    #1,d0
  3280.     bmi    a1_clr_d0x4_end
  3281. @@:
  3282.     move.l    d1,(a1)+
  3283.     dbra    d0,@b
  3284.     clr.w    d0
  3285.     subq.l    #1,d0
  3286.     bcc    @b
  3287.     rts
  3288.  
  3289.  
  3290. a1_clr_d0x4:
  3291.     subq.w    #1,d0
  3292.     bmi    a1_clr_d0x4_end
  3293. @@:
  3294.     move.l    d1,(a1)+
  3295.     dbra    d0,@b
  3296. a1_clr_d0x4_end:
  3297.     rts
  3298.  
  3299.  
  3300. mem_err:
  3301.     IERROR    1
  3302.  
  3303.  
  3304.  
  3305.  
  3306.  
  3307.     .end
  3308.  
  3309.